×Закрыть

File.Move C#. Есть ли более быстрая альтернатива

Хотелось бы избежать лишнего копирования/удаления файлов при простом переименовании. А судя по скорости работы File.Move с большими объёмами файлов оно присутствует. Как достичь скорости как у стандарнтного Windows переименования?

LinkedIn
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

А с чего вы взяли что moveTo что-то куда-то копирует ? Если файл находится на том же физическом диске то его «перемещение» означает лишь прописать новый путь в заголовках таблиц дисковой подсистемы и не более. Никакого физического перемещения сегментов самого файла не происходит, в этом нет смысла.

File.Move враппер над KERNEL32!MoveFileW

kc
 # Call Site
00 KERNELBASE!MoveFileWithProgressW
01 KERNEL32!MoveFileW
02 mscorlib_ni!DomainNeutralILStubClass.IL_STUB_PInvoke(System.String, System.String)
03 mscorlib_ni!System.IO.File.InternalMove(System.String, System.String, Boolean)

MoveFileWithProgressW вызывается с флагом MOVEFILE_COPY_ALLOWED: msdn.microsoft.com/...​op/aa365242(v=vs.85).aspx

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

System.IO.File.InternalMove делает немного больше, чем простой вызов Win32Native.MoveFile, например проверят, что исходный файл существует, но вряд ли это существенно влияет на скорость копирования в вашем случае.

FileInfo :

“If you are going to reuse an object several times, consider using the instance method of FileInfo instead of the corresponding static methods of the File class, because a security check will not always be necessary”

так дело в том, что я не буду один файл несколько раз использовать. Сомневаюсь, что FileInfo.MoveTo будет быстрее, чем File.Move

А ты попробуй. И Parallel.For натрави на этот метод.

Подписаться на комментарии