如何在 C# 中不使用 RequestAddFolderAsync 将文件夹添加到 StorageLibrary

How to add folder to StorageLibrary without RequestAddFolderAsync in C#

我需要将应用程序文件保存到插入的 SD 卡中。我正在使用 UWP 和 Windows 10.
MSDN 讲述了 to do it 如何使用 Windows 库。

var myPicsLibrary = await Windows.Storage.StorageLibrary.GetLibraryAsync(Windows.Storage.KnownLibraryId.Pictures);
await myPicsLibrary.RequestAddFolderAsync();

RequestAddFolderAsync()显示文件选择器,用户可以在其中选择要添加到图片中的文件夹。在我的例子中,它是一个在 SD 卡上创建的文件夹。

有没有办法在没有文件选择器对话框的情况下做这件事?

我正在尝试 like this:

var myPicsLibrary = await Windows.Storage.StorageLibrary.GetLibraryAsync(Windows.Storage.KnownLibraryId.Pictures);

// Get the logical root folder for all external storage devices.
StorageFolder externalDevices = Windows.Storage.KnownFolders.RemovableDevices;

// Get the first child folder, which represents the SD card.
StorageFolder sdCard = (await externalDevices.GetFoldersAsync()).FirstOrDefault();

var folder = await sdCard.CreateFolderAsync("MySDCardFolder");

myPicsLibrary.Folders.Insert(myDocs.Folders.Count+1, folder); // NotImplementedException: 'The method or operation is not implemented.'
myPicsLibrary.Folders.Add(folder); // NotImplementedException: 'The method or operation is not implemented.'

或者我可以不使用直接与 SDCard 一起工作的 Windows 库来做同样的事情?

非常感谢!

编辑:

另一方面,我的问题听起来像 "How to save files to plugged SD card?"

根据你的问题,你需要在 PicturesLibrary 中创建一个文件夹。 您可以使用下面的代码将文件夹添加到 PicturesLibrary

await Windows.Storage.KnownFolders.PicturesLibrary.CreateFolderAsync("MySDCardFolder");

如果您只想将其制作在 SD 卡上也许 KnownFolders.RemovableDevices 应该会有帮助。我还没有使用 KnownFolders.RemovableDevices,但如果您有任何问题,请告诉我直接在我的 phone 上进行测试

StorageLibrary.Folders获取当前库中的文件夹,returnIObservableVectorStorageFolder。当我们将文件夹添加到 IObservableVector 时,它不会更改文件系统中的文件夹。它将抛出 "The method or operation is not implemented." 异常。

我们应该能够获取文件夹的名称,并使用该名称创建文件夹。然后我们可以StorageFile.CopyAsync方法复制你文件夹里的文件。

例如:

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);
    }
}

然后我们就可以使用CopyFolderAsync的方法来复制图片库中的文件夹了

var myPicsLibrary = await Windows.Storage.StorageLibrary.GetLibraryAsync(Windows.Storage.KnownLibraryId.Pictures);
var myfolder = myPicsLibrary.Folders[0];
StorageFolder externalDevices = Windows.Storage.KnownFolders.RemovableDevices;
StorageFolder sdCard = (await externalDevices.GetFoldersAsync()).FirstOrDefault();
var folder = await sdCard.CreateFolderAsync("MySDCardFolder");
await CopyFolderAsync(folder, myfolder);