FileInfo не работает на * Short * Path Name - PullRequest
1 голос
/ 01 мая 2019

Даже если я использую сокращенный путь, (.Net) FileInfo () терпит неудачу, говоря, что это слишком долго!

У меня были проблемы с длинными путями, поэтому я сделал вызов (Win32) GetShortPathNameW, который возвращает очень красиво ваяемое короткое имя, например:
"C: \ temp \ Test \ targ1 \ FIRSTH ~ 1\ ВТОРАЯ ~ 1 \ SumStuff.txt.somethingTooLong.junk».

Даже если длина всего 72 символа, (.Net) FileInfo () выдает исключение, говорящее: «Указанный путь, имя файла или оба слишком длинные. Полное имя файла должно быть меньше чем260 символов, а имя каталога должно быть не более 248 символов. "

Да, LFN слишком длинный (> 400 символов), но при укорочении выглядит нормально..Net конвертирует его обратно в long?

(Использование .Net 3.5 (наименьший общий знаменатель) под Windows 10.)

    // code below is extremely abbreviated
    [DllImport ( "kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    private static extern int GetShortPathNameW ( string path, StringBuilder Buffer, int bufferSize);
    …
    int PathLength = GetShortPathNameW ( Path_, buffer, buffer.Capacity);
    …
    FileInfo FileMeta = new FileInfo ( buffer.ToString());
    // is fine if the LFN is short (<260)
    // but exception using a shortened path name

ОК. Я добавляю этот пример, который я скомпилировал и запустил, с той же ошибкой.Я не могу не чувствовать, что дебаты по Unicode / Marshalling отвлекают меня от моей настоящей проблемы:

    // simplified example (should have started with this)
    static void Main ( string[] args)
    {
    FileInfo FileMeta = new FileInfo ( @"C:\temp\Test\targ1\FIRSTH~1\SECOND~1\SumStuff.txt.somethingTooLong.junk");
    Console.WriteLine ( "Size: " + FileMeta.Length.ToString());
    }

Все еще получаю то же возвращение:

    Unhandled Exception: System.IO.PathTooLongException: The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters.  
    at System.IO.Path.SafeSetStackPointerValue(Char* buffer, Int32 index, Char value)  
    at System.IO.Path.NormalizePathFast(String path, Boolean fullCheck)  
    at System.IO.FileInfo..ctor(String fileName)  
    at Test.Program.Main(String[] args) in E:\Projects\Test\Test\Program.cs:line 12  

...