Как получить длину файла с путем, превышающим 260 символов? - PullRequest
2 голосов
/ 06 июля 2010

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

string fullPath = "C:\path\file.ext";
FileInfo info = new FileInfo(fullPath);
long len = info.Length;

Если длина пути превышает 260 символов, конструктор FileInfo выдает исключение PathTooLongException.Я читал записи в блоге Кима Гамильтона о длинных путях к файлам в .NET, так что я знаю, что это можно сделать, если я откажусь от фреймворка и сделаю все это с помощью вызовов Win32 API.Есть ли способ сделать это с помощью фреймворка?

Записи в блоге Кима Гамильтона о длинных путях к файлам в .NET:
Часть 1
Часть 2
Часть 3

Ответы [ 4 ]

4 голосов
/ 06 июля 2010

Посетите сайт BCL Codeplex, у них есть будущее расширение, которое может вам помочь:

http://bcl.codeplex.com/wikipage?title=Long%20Path

3 голосов
/ 06 июля 2010

Windows поддерживает пути длиннее 260. Однако эта функция не предоставляется напрямую через .NET. Чтобы получить длину файла с длиной пути более 260, используйте функцию GetFileAttributesEx Windows API, доступ к которой можно получить в .NET с помощью маршаллинга:

[StructLayout(LayoutKind.Sequential)]
public struct WIN32_FILE_ATTRIBUTE_DATA
{
    public FileAttributes dwFileAttributes;
    public FILETIME ftCreationTime;
    public FILETIME ftLastAccessTime;
    public FILETIME ftLastWriteTime;
    public uint nFileSizeHigh;
    public uint nFileSizeLow;
}

public enum GET_FILEEX_INFO_LEVELS {
    GetFileExInfoStandard,
    GetFileExMaxInfoLevel
}

public class MyClass
{
    [DllImport("kernel32.dll", SetLastError=true, CharSet=CharSet.Unicode)]
    private static extern bool GetFileAttributesEx(string lpFileName,
          GET_FILEEX_INFO_LEVELS fInfoLevelId, out WIN32_FILE_ATTRIBUTE_DATA fileData);

    public static long GetFileLength(string path)
    {
         // Check path here

         WIN32_FILE_ATTRIBUTE_DATA fileData;

         // Append special suffix \\?\ to allow path lengths up to 32767
         path = "\\\\?\\" + path;

         if(!GetFileAttributesEx(path,
                 GET_FILEEX_INFO_LEVELS.GetFileExInfoStandard, out fileData))
         {
               throw new Win32Exception();
         }
         return (long)(((ulong)fileData.nFileSizeHigh << 32) +
                        (ulong)fileData.nFileSizeLow);
    }
}
1 голос
/ 25 июля 2013

Попробуйте библиотеку Zeta Long Paths: http://zetalongpaths.codeplex.com/

0 голосов
/ 13 июля 2016

Работает с Microsoft Scripting Runtime COM ссылкой

var fso = new Scripting.FileSystemObject();
double fileSize = fso.GetFile(path).Size;  // path is over 300 chars
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...