C# 在WinRT上复制文件夹
目前,我只知道如何使用以下方法复制文件:C# 在WinRT上复制文件夹,c#,windows-8,copy,winrt-async,C#,Windows 8,Copy,Winrt Async,目前,我只知道如何使用以下方法复制文件: IStorageFolder dir = Windows.Storage.ApplicationData.Current.LocalFolder; IStorageFile file = await StorageFile.GetFileFromApplicationUriAsync( new Uri("ms-appx:///file.txt")); await file.CopyAsync(dir, "file.txt"); 当我试图复制
IStorageFolder dir = Windows.Storage.ApplicationData.Current.LocalFolder;
IStorageFile file = await StorageFile.GetFileFromApplicationUriAsync(
new Uri("ms-appx:///file.txt"));
await file.CopyAsync(dir, "file.txt");
当我试图复制文件夹和其中的所有内容时,我找不到像上面的copyanc
这样的API
是否可以复制WinRT中的文件夹和所有内容?一种可能是使用
StorageFolder.GetItemsAsync();
从Windows.Storage
-命名空间
调用的结果是
IReadOnlyList<IStorageItem>
IReadOnlyList
包含当前文件夹的所有文件和文件夹。
然后你就可以做这些了
请参阅以获取进一步参考。根据答案,我生成自己的副本文件夹:
namespace Directories
{
private string ROOT = "root";
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
CopyFolder(ROOT);
}
private async void CopyFolder(string path)
{
IStorageFolder destination = Windows.Storage.ApplicationData.Current.LocalFolder;
IStorageFolder root = Windows.ApplicationModel.Package.Current.InstalledLocation;
if (path.Equals(ROOT) && !await FolderExistAsync(ROOT))
await destination.CreateFolderAsync(ROOT);
destination = await destination.GetFolderAsync(path);
root = await root.GetFolderAsync(path);
IReadOnlyList<IStorageItem> items = await root.GetItemsAsync();
foreach (IStorageItem item in items)
{
if (item.GetType() == typeof(StorageFile))
{
IStorageFile presFile = await StorageFile.GetFileFromApplicationUriAsync(
new Uri("ms-appx:///" + path.Replace("\\", "/") + "/" + item.Name));
// Do copy file to destination folder
await presFile.CopyAsync(destination);
}
else
{
// If folder doesn't exist, than create new one on destination folder
if (!await FolderExistAsync(path + "\\" + item.Name))
await destination.CreateFolderAsync(item.Name);
// Do recursive copy for every items inside
CopyFolder(path + "\\" + item.Name);
}
}
}
private async Task<bool> FolderExistAsync(string foldername)
{
IStorageFolder destination = Windows.Storage.ApplicationData.Current.LocalFolder;
try
{
await destination.GetFolderAsync(foldername);
return true;
}
catch (Exception ex)
{
return false;
}
}
}
}
它将从InstalledLocation
文件夹复制到LocalFolder
不确定C是否支持Array.map方法,但这是JavaScript的copyFolderAsync代码的外观
CreationCollisionOption = Windows.Storage.CreationCollisionOption;
NameCollisionOption = Windows.Storage.NameCollisionOption;
copyFolderAsync = function(sourceFolder, destFolder) {
return destFolder.createFolderAsync(sourceFolder.name, CreationCollisionOption.openIfExists).then(function(destSubFolder) {
return sourceFolder.getFilesAsync().then(function(files) {
return WinJS.Promise.join(files.map(function(file) {
return file.copyAsync(destSubFolder, file.name, NameCollisionOption.replaceExisting);
}));
}).then(function() {
return sourceFolder.getFoldersAsync();
}).then(function(folders) {
return WinJS.Promise.join(folders.map(function(folder) {
return copyFolderAsync(folder, destSubFolder);
}));
});
});
};
上面的代码并没有让我满意(太具体了),我制作了自己的通用代码,所以我想我可以分享它:
public static async Task CopyFolderAsync(StorageFolder source, StorageFolder destinationContainer, string desiredName = null)
{
StorageFolder destinationFolder = null;
destinationFolder = await destinationContainer.CreateFolderAsync(
desiredName ?? source.Name, CreationCollisionOption.ReplaceExisting);
foreach (var file in await source.GetFilesAsync())
{
await file.CopyAsync(destinationFolder, file.Name, NameCollisionOption.ReplaceExisting);
}
foreach (var folder in await source.GetFoldersAsync())
{
await CopyFolderAsync(folder, destinationFolder);
}
}
您遇到了什么错误?我找不到复制文件夹的API,如上面的复制文件。您遇到了编译器错误或链接器错误吗?没有错误,问题是,我不知道复制文件夹的API是否存在。所以,我试着在这里问我是否错过了什么。如果API真的不存在,那么我必须手动执行,循环所有子文件夹并逐个复制所有文件。明白了。。。据我所知,WinRT正在限制其处理文件/文件夹(沙盒)的能力。谢谢您提供的信息,但在我再次检查后,StorageFolder.GetItemsAsync()的结果是
IReadOnlyList
。现在,我尝试使用递归实现它,完成后我会更新代码。创建文件夹时,“替换现有文件夹”是删除旧文件夹(及其内容)还是将该现有文件夹用作目标?我想说,现有文件夹被创建的空文件夹替换,因此现有内容丢失。但我还没有测试过诚实。这很有效。此外,我还添加了2条deleteSync()语句来删除所有文件和文件夹。我想把文件夹从一个路径移到另一个路径。非常紧凑。这里结束的是调用代码,用于从Appx复制到localFolderDim localFldr=Await ApplicationData.Current.localFolder.TryGetItemAsync(“localFolder”),如果localFldr为Nothing,则Dim appFldr=Await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFolderAsync(“localFolder”)如果
public static async Task CopyFolderAsync(StorageFolder source, StorageFolder destinationContainer, string desiredName = null)
{
StorageFolder destinationFolder = null;
destinationFolder = await destinationContainer.CreateFolderAsync(
desiredName ?? source.Name, CreationCollisionOption.ReplaceExisting);
foreach (var file in await source.GetFilesAsync())
{
await file.CopyAsync(destinationFolder, file.Name, NameCollisionOption.ReplaceExisting);
}
foreach (var folder in await source.GetFoldersAsync())
{
await CopyFolderAsync(folder, destinationFolder);
}
}