Как преодолеть исключение PathTooLongException? - PullRequest
5 голосов
/ 25 мая 2011

Итак, я пишу программу, которая будет сканировать дубликаты файлов на компьютере, поскольку программы, которые я видел, работают очень медленно и / или загружаются из памяти, но я столкнулся с PathTooLongException, когда пыталсявесь диск.После прочтения PathTooLongException в коде C # мне стало интересно узнать о следующих двух вопросах.

  1. Повредит ли это моей производительности, если я буду переключать свой текущий каталог каждый раз, когда меняюуровни?

  2. Есть ли лучший способ получить структуру каталогов всех файлов (возможно, вызвав что-то вроде tree.exe и затем проанализировав его)?

Ответы [ 3 ]

3 голосов
/ 23 мая 2012

Смотрите эту библиотеку!

.NET Base Class Libraries : Long Path

1 голос
/ 18 ноября 2014

или сделай сам,

using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
using Microsoft.Win32.SafeHandles;

[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
internal static extern IntPtr FindFirstFile(string lpFileName, out
                                WIN32_FIND_DATA lpFindFileData);

[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
internal static extern bool FindNextFile(IntPtr hFindFile, out
                                WIN32_FIND_DATA lpFindFileData);

[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool FindClose(IntPtr hFindFile);

// Assume dirName passed in is already prefixed with \\?\
public static IEnumerable<string> EnumerateEntries(string directory)
{ 
    WIN32_FIND_DATA findData;
    IntPtr findHandle = FindFirstFile(dirName + @"\*", out findData);

    try
    {
        if (findHandle != INVALID_HANDLE_VALUE)
        {
            bool found;
            do
            {
                string currentFileName = findData.cFileName;

                // if this is a directory, find its contents
                if (((int)findData.dwFileAttributes &
                                FILE_ATTRIBUTE_DIRECTORY) != 0)
                {
                    if (currentFileName != "." && currentFileName != "..")
                    {
                        foreach(var child in FindFilesAndDirs(
                                Path.Combine(dirName, currentFileName))
                        {
                            yield return child;
                        }
                    }
                }

                yield return Path.Combine(dirName, currentFileName);

                // find next
                found = FindNextFile(findHandle, out findData);
            }
            while (found);
        }

    }
    finally
    {
        // close the find handle
        FindClose(findHandle);
    }
}

Я не проверял этот код и, очевидно, не все типы определены, но он должен указывать нам правильное направление.

0 голосов
/ 04 марта 2016

Pure C #, нуждается в оптимизации, но даст людям уверенность в себе, не используя внешнюю библиотеку или не вызывая p /.

...