如何加快目录的移动过程?
How to speed up the moving process of a directory?
由于 StorageFolder 没有任何功能可以移动到 UWP 中的另一个目的地 API,我创建了自己的文件夹:
public static async Task MoveTo(this StorageFolder source, StorageFolder destination, string folderName, CreationCollisionOption creationCollisionOption = CreationCollisionOption.GenerateUniqueName, NameCollisionOption nameCollisionOption = NameCollisionOption.GenerateUniqueName) {
StorageFolder root = await destination.CreateFolderAsync(folderName, CreationCollisionOption.ReplaceExisting);
destination = root;
foreach(StorageFile file in await source.GetFilesAsync()) {
await file.MoveAsync(destination, file.Name, NameCollisionOption.ReplaceExisting);
}
foreach(StorageFolder folder in await source.GetFoldersAsync()) {
await MoveTo(folder, destination, folder.Name);
}
}
不幸的是,这段代码真的很慢。移动956个文件和25个文件夹大约需要20-25分钟。
我确定问题是因为它是通过 Task
.
逐一处理的
有人可以给我一些建议吗?非常感谢您。
您可以使用并行技术获得更好的结果(我不会在这里展示它,因为它并没有那么快)但是您可以做得更好很多使用 Win32 API MoveFileFromAppW
如果你 P/Invoke 它。只要您拥有访问权限(例如,由 FolderPicker
授予),这将适用于 UWP。
如果目标与源位于同一驱动器上,几乎可以立即执行(这是一个简单的重命名)。如果它们位于不同的驱动器上,您将需要执行一些逻辑来创建每个目录 (CreateDirectoryFromAppW
),然后移动文件。它仍然比用户 StorageFile
.
快得多
由于 StorageFolder 没有任何功能可以移动到 UWP 中的另一个目的地 API,我创建了自己的文件夹:
public static async Task MoveTo(this StorageFolder source, StorageFolder destination, string folderName, CreationCollisionOption creationCollisionOption = CreationCollisionOption.GenerateUniqueName, NameCollisionOption nameCollisionOption = NameCollisionOption.GenerateUniqueName) {
StorageFolder root = await destination.CreateFolderAsync(folderName, CreationCollisionOption.ReplaceExisting);
destination = root;
foreach(StorageFile file in await source.GetFilesAsync()) {
await file.MoveAsync(destination, file.Name, NameCollisionOption.ReplaceExisting);
}
foreach(StorageFolder folder in await source.GetFoldersAsync()) {
await MoveTo(folder, destination, folder.Name);
}
}
不幸的是,这段代码真的很慢。移动956个文件和25个文件夹大约需要20-25分钟。
我确定问题是因为它是通过 Task
.
有人可以给我一些建议吗?非常感谢您。
您可以使用并行技术获得更好的结果(我不会在这里展示它,因为它并没有那么快)但是您可以做得更好很多使用 Win32 API MoveFileFromAppW
如果你 P/Invoke 它。只要您拥有访问权限(例如,由 FolderPicker
授予),这将适用于 UWP。
如果目标与源位于同一驱动器上,几乎可以立即执行(这是一个简单的重命名)。如果它们位于不同的驱动器上,您将需要执行一些逻辑来创建每个目录 (CreateDirectoryFromAppW
),然后移动文件。它仍然比用户 StorageFile
.