File.Delete и Directory.Delete производительность сети - PullRequest
1 голос
/ 27 февраля 2012

Кто-нибудь знает, как File.Delete и Directory.Delete выполняются?

Я имею в виду: что произойдет, если предположить, что я должен был удалить некоторые файлы / папки по сети, а сеть значительно медленная?

Завершится ли это так же быстро, как и локально?Будет ли он потреблять больше пропускной способности, чем, скажем, перемещать файлы в эту сетевую папку?

Ответы [ 6 ]

1 голос
/ 27 февраля 2012

Будет ли он завершен так же быстро, как и локально?

Нет, он довольно медленный, потому что в Windows нет каталога удаления - Directory.Delete перечисляет все файлы по сетизатем удаляет их.То же, что и Windows Explorer. В зависимости от количества файлов, это может занять некоторое время.При удалении 30 000 файлов сначала перечисляется их, а затем 30 000 отдельных операций удаления.

Будет ли это занимать большую пропускную способность, чем, скажем, перемещение файлов в эту сетевую папку?

Нет, не будет, потому что файлы никогда не перемещаются.Копирование файлов всегда происходит намного медленнее, чем их удаление.

1 голос
/ 27 февраля 2012

Они оба вызывают Win32 API для работы,

Это от отражателя 7:

[SecuritySafeCritical]
public static void Delete(string path)
{
    if (path == null)
    {
        throw new ArgumentNullException("path");
    }
    string fullPathInternal = Path.GetFullPathInternal(path);
    new FileIOPermission(FileIOPermissionAccess.Write, new string[] { fullPathInternal }, false, false).Demand();
    if (!Win32Native.DeleteFile(fullPathInternal))
    {
        int errorCode = Marshal.GetLastWin32Error();
        if (errorCode != 2)
        {
            __Error.WinIOError(errorCode, fullPathInternal);
        }
    }
}
1 голос
/ 27 февраля 2012

Это будет не так быстро, как это было бы локально.Это будет медленно, с задержкой, которая зависит от условий вашей сети.

Вы не отправляете вашу команду Delete «удаленно» на «умный конец», который знает, как, скажем, удалить папкукак атомная операция.Ваш код на самом деле работает с сетевым расположением, которое является «тупым» и удаляет файл за файлом.

Что касается вашего последнего вопроса, Delete почти всегда быстрее, чем Move.Когда вы перемещаете файлы по дискам (и, конечно, по сетевым папкам), на самом деле это операция копирования (с «delete» в конце).

0 голосов
/ 27 февраля 2012

Они оборачивают вызовы через Win32 API.

Проверьте их функцию через бесплатный инструмент здесь. ILSPY

Или платная альтернатива Отражатель

0 голосов
/ 27 февраля 2012

Они в основном используют соответствующие собственные API-интерфейсы Win32, что означает, что производительность почти такая же, как и с собственным приложением (нет реальной разницы между .NET и собственным) ...

В основном все операции ввода-вывода файлов выполняются медленнее, если они выполняются на сетевом диске / путях / общих ресурсах, поэтому: да, они будут медленнее по сравнению с той же самой операцией, выполняемой локально. Насколько медленнее, зависит от нескольких аспектов, включая (но не ограничиваясь этим) задержку в сети, производительность сервера, файловой системы и т. Д.

0 голосов
/ 27 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...