所有文章 > 日积月累 > Windows 浏览文件夹API详解与实践
Windows 浏览文件夹API详解与实践

Windows 浏览文件夹API详解与实践

在现代软件开发中,文件和文件夹的访问是常见的需求。Windows提供了一系列的API来帮助开发者实现这一功能。本文将深入探讨Windows浏览文件夹API的使用和实践,包括API的介绍、如何使用以及相关的代码示例。

重要的API概览

在使用Windows文件和文件夹API之前,我们需要了解几个关键的API:

  • FileOpenPicker:用于打开文件。
  • FolderPicker:用于打开文件夹。
  • StorageFile:表示文件的对象。

这些API允许用户通过一个统一的界面来访问和选择文件或文件夹,无论是在文件系统内部还是在其他应用中。

文件选取器的异步编程基础

在深入代码实现之前,了解异步编程是非常重要的。这可以帮助我们更好地处理文件和文件夹的访问,特别是在UI线程中避免阻塞。以下是异步编程的一些基础:

C#或Visual Basic中的异步编程

对于C#或Visual Basic,可以查阅使用C#或Visual Basic调用异步API来了解更多。

C++中的异步编程

对于C++开发者,可以查阅使用C++进行异步编程

文件选取器的用户界面设计

文件选取器的用户界面设计旨在提供一致性和引导用户操作。它包括当前位置、用户选择的项以及可浏览的位置树。这些位置不仅包括文件系统位置,如音乐或下载文件夹,还包括实现文件选取器合约的应用,如相机、照片和Microsoft OneDrive。

文件选取器的工作原理

文件选取器允许应用访问、浏览和保存文件及文件夹。选取的文件或文件夹会作为StorageFileStorageFolder对象返回,以便进一步操作。

选取单个文件的完整代码示例

以下是使用FileOpenPicker选取单个文件的完整代码示例:

var picker = new Windows.Storage.Pickers.FileOpenPicker();
picker.ViewMode = Windows.Storage.Pickers.PickerViewMode.Thumbnail;
picker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.PicturesLibrary;
picker.FileTypeFilter.Add(".jpg");
picker.FileTypeFilter.Add(".jpeg");
picker.FileTypeFilter.Add(".png");

Windows.Storage.StorageFile file = await picker.PickSingleFileAsync();
if (file != null)
{
    // Application now has read/write access to the picked file
    this.textBlock.Text = "Picked photo: " + file.Name;
}
else
{
    this.textBlock.Text = "Operation cancelled.";
}

选取单个文件的分步指南

创建和自定义FileOpenPicker

在创建FileOpenPicker对象时,可以设置几个关键属性来优化用户体验:

  • ViewMode:设置为Thumbnail可以显示文件的缩略图,适用于图片和视频的选择。
  • SuggestedStartLocation:建议用户从图片库开始选择,也可以根据需要设置为其他位置。
  • FileTypeFilter:指定允许用户选择的文件类型。

显示FileOpenPicker

用户可以通过FileOpenPicker选择单个文件或多个文件。以下是两种情况的代码示例:

// 选取单个文件
Windows.Storage.StorageFile file = await picker.PickSingleFileAsync();

// 选取多个文件
var files = await picker.PickMultipleFilesAsync();

选取文件夹的完整代码示例

以下是使用FolderPicker选取单个文件夹的完整代码示例:

var folderPicker = new Windows.Storage.Pickers.FolderPicker();
folderPicker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.Desktop;
folderPicker.FileTypeFilter.Add("*");

Windows.Storage.StorageFolder folder = await folderPicker.PickSingleFolderAsync();
if (folder != null)
{
    // Application now has read/write access to all contents in the picked folder
    Windows.Storage.AccessCache.StorageApplicationPermissions.FutureAccessList.AddOrReplace("PickedFolderToken", folder);
    this.textBlock.Text = "Picked folder: " + folder.Name;
}
else
{
    this.textBlock.Text = "Operation cancelled.";
}

文件和文件夹的访问权限

在访问文件和文件夹时,了解相关的访问权限是非常重要的。可以查阅文件访问权限来了解更多。

桌面应用中的文件选取器

在桌面应用(包括WinUI 3应用)中,可以使用Windows.Storage.Pickers中的文件和文件夹选取器。但是,如果桌面应用需要提升权限才能运行,则需要采取不同的方法,因为这些API不是为提升权限的应用设计的。

桌面应用中的特殊考虑

对于需要提升权限的桌面应用,可以查阅FileSavePicker中的示例。

代码示例:桌面应用中的文件和文件夹操作

以下是桌面应用中打开文件、保存文件和浏览文件夹的代码示例:

// 打开文件
TCHAR szPathName[MAX_PATH];
OPENFILENAME ofn = {OPENFILENAME_SIZE_VERSION_400};
// ... 省略部分代码 ...
BOOL bOk = GetOpenFileName(&ofn);
if (bOk)
{
    CString strFile = _T("Select file %s"),szPathName);
    MessageBox(strFile);
}

// 保存文件
// ... 省略部分代码 ...
BOOL bOk = GetSaveFileName(&ofn);
if (bOk)
{
    CString strFile = _T("Save file %s"),szPathName);
    MessageBox(strFile);
}

// 浏览文件夹
// ... 省略部分代码 ...
if (lpDlist!=NULL)
{
    SHGetPathFromIDList(lpDlist,szPathName);
    CString strFile = _T("Select path %s/n"),szPathName);
    MessageBox(strFile);
}

FAQ

问:如何使用FileOpenPicker选择多个文件?

答:可以通过调用FileOpenPicker的PickMultipleFilesAsync方法来选择多个文件。

问:FolderPicker和FileOpenPicker有什么区别?

答:FolderPicker用于选择文件夹,而FileOpenPicker用于选择文件。

问:如何设置文件选取器的起始位置?

答:可以通过设置FileOpenPicker或FolderPicker的SuggestedStartLocation属性来设置起始位置。

问:选取的文件如何进行读写操作?

答:选取的文件作为StorageFile对象返回,可以直接对其进行读写操作。

问:如何添加文件和文件夹的访问权限?

答:需要在应用的manifest中声明相应的权限,并在代码中检查和请求这些权限。

#你可能也喜欢这些API文章!