我正在移植libgit2以获得Git GUI for UWP。方案是让用户使用FolderPicker::PickSingleFolderAsync选择一个存储库文件夹,然后将其添加到FutureAccessList,以便应用程序可以访问它以获取常用的Git功能。问题是底层的Git代码在很大程度上依赖于Win32 API文件和文件夹访问权限,例如FindFirstFile
,MoveFileEx
,...用于文件和文件夹stat
,open
, ...并且在尝试访问时,应用程序报告权限被拒绝。 (该代码适用于应用程序本地存储中的文件夹。我还检查过通常stdio
只在那里工作。除此之外不能fopen
。)
这是否有可行的解决方案?不应该在不同支持的API中获得许可,我可能错过了什么? (我不敢尝试移植libgit2
所需的所有POSIX。一方面,它将保证效率低下。另一方面,它极易出错,如写mmap
与open
配合得很好。)
答案 0 :(得分:1)
实现这样的事情不可能!
根据@RobCaplan https://blogs.msdn.microsoft.com/wsdevsol/2012/12/04/skip-the-path-stick-to-the-storagefile/,微软的天才发明了一种安全存储解决方案,既不强安全也不<强>向后兼容又名制作开发者&#39;生活更轻松:用户授予应用StorageFolder
后,应用可能会使用提供的StorageFile
API对其造成严重破坏。以下代码
auto folderPicker = ref new Windows::Storage::Pickers::FolderPicker();
folderPicker->FileTypeFilter->Clear();
folderPicker->FileTypeFilter->Append("*");
create_task(folderPicker->PickSingleFolderAsync()).then([](Windows::Storage::StorageFolder^ folder)
{
if (folder == nullptr)
cancel_current_task();
Windows::Storage::AccessCache::StorageApplicationPermissions::FutureAccessList->Add(folder);
create_task(folder->GetItemsAsync()).then([](IVectorView<IStorageItem^>^ items)
{
// Delete the folder content or encrypt it and demand money
auto iter = items->First();
while (iter->HasCurrent)
{
create_task(iter->Current->DeleteAsync(StorageDeleteOption::PermanentDelete));
iter->MoveNext();
}
});
});
很乐意清除不幸用户选择的文件夹。恶意应用程序甚至不需要使用Win32 API来执行此操作。从逻辑上讲, API不是安全问题的原因。现有的UWP Win32 API显然可以正确处理本地存储访问,因此在Win32 API中支持FutureAccessList
只需要很少的工作量。使UWP发展困难的这种愿望必须是有意的。 (毫无疑问,Centenial 不会飞。没有人想要从Win32的灵活性转移到UWP监狱。)
编辑:我应该写
实现我想要的方式是不可能的!
因为文章确实提出了一个快速且非常智能的解决方案
如果库没有这样的接口而您无法添加,那么您需要将StorageFile内容复制到应用程序数据文件夹(可能在TemporaryFolder中),然后将路径传递给临时副本到库
所以在我的情况下,每次用户选择一个存储库文件夹时,我都可以将整个文件夹复制到本地存储,对它们进行操作,然后将整个文件复制回原来的位置。当然&#34;我想要的方式&#34;上面指的是高效的,你不必来回复制。