На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
Модераторы: maxim84_, juice
  
> Ошибка открытия файла из-за длинного полного имени файла
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 -
CyberLock | BloodBath-LAN
Немного творчества - альбом ArtMetal [Metal, Instrumental, Orchestral]
Спасибо большое за ответы. Попробую.
К сожалению, не получилось решить проблему с длинными именами. Добавление в начало имени файла \\?\ привело к тому, что строки перестали находится в файлах, которые раньше находились. С короткими именами тоже у меня не получилось, наверное, что-то делаю неправильно. Прикрепил проект. Архив с директориями, имитирующий длинные имена файлов, разместил по ссылке 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();
            }
     
        }
     
    }
CyberLock | BloodBath-LAN
Немного творчества - альбом ArtMetal [Metal, Instrumental, Orchestral]
Спасибо большое, VisualProg, с Вашим кодом все получилось. Видимо, я неправильно использовал функцию GetShortPathName.
1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
0 пользователей:


Рейтинг@Mail.ru
[ Script Execution time: 0,1108 ]   [ 20 queries used ]   [ Generated: 20.05.18, 11:51 GMT ]