На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Ошибка открытия файла из-за длинного полного имени файла
    Windows XP и 7, Visual Studio 10 и 12. В программе на C# при открытии файла doc
    ExpandedWrap disabled
      doc = word.Documents.Open(ref filename, ref confConv, ref readOnly);
    возникает ошибка из-за длинного полного имени файла (более 255 знаков). К сожалению, изменить имя файла я не могу, пользователи засовывают свои файлы в глубокие директории и в имени файла пишут еще и пояснения. Подскажите, пожалуйста, есть ли какие-либо способы обойти ограничение Windows на полное имя файла?
      tumanovalex, а если попробовать обойти это ограничение? Скопировать исходный файл в другую директорию (чтобы имя стало короче). Обработать и поместить обратно.
        Добавь к имени UNC префикс "\\?\D:\very long path"
          Попробуйте извлечь короткие пути к каждой подпапке и конкретно к файлу. Получится путь с гарантированной длинной меньше 255 символов, поправочка, меньше 260 символов*.

          ExpandedWrap disabled
            [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
            public static extern int GetShortPathName([MarshalAs(UnmanagedType.LPTStr)] string path, [MarshalAs(UnmanagedType.LPTStr)] StringBuilder shortPath, int shortPathLength);
          Сообщение отредактировано: VisualProg -
            Спасибо большое за ответы. Попробую.
              К сожалению, не получилось решить проблему с длинными именами. Добавление в начало имени файла \\?\ привело к тому, что строки перестали находится в файлах, которые раньше находились. С короткими именами тоже у меня не получилось, наверное, что-то делаю неправильно. Прикрепил проект. Архив с директориями, имитирующий длинные имена файлов, разместил по ссылке https://yadi.sk/d/qGDPtYrp3VgbpT (не получилось прикрепить к теме из-за большого размера - 358 кб).
                Цитата tumanovalex @
                С короткими именами тоже у меня не получилось, наверное, что-то делаю неправильно.

                Что именно не получилось?

                ExpandedWrap disabled
                  using System;
                  using System.Runtime.InteropServices;
                  using System.Text;
                   
                  namespace Sources {
                   
                      public class Program {
                   
                          const int MAX_PATH = 255;
                   
                          [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
                          public static extern int GetShortPathName([MarshalAs(UnmanagedType.LPTStr)] string path, [MarshalAs(UnmanagedType.LPTStr)] StringBuilder shortPath, int shortPathLength);
                          
                          private static string GetShortPath(string path) {
                              var shortPath = new StringBuilder(MAX_PATH);
                              GetShortPathName(path, shortPath, MAX_PATH);
                              return shortPath.ToString();
                          }
                          
                          static void Main(string[] args) {
                              string test = GetShortPath(@"D:\m\!!! Длинное имя файла\1111111111 1111111111 1111111111 1111111111 1111111111\2222222222 2222222222 2222222222 2222222222 2222222222\3333333333 3333333333 3333333333 3333333333 3333333333\4444444444 4444444444\444_Объединенные ячейки 11111.doc");
                              Console.WriteLine(test);
                              Console.ReadKey();
                          }
                   
                      }
                   
                  }
                  Спасибо большое, VisualProg, с Вашим кодом все получилось. Видимо, я неправильно использовал функцию GetShortPathName.
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0344 ]   [ 16 queries used ]   [ Generated: 28.03.24, 12:31 GMT ]