我正在移植libgit2以获得Git GUI for UWP . 方案是让用户使用FolderPicker::PickSingleFolderAsync选择一个存储库文件夹,然后将其添加到FutureAccessList,以便应用程序可以访问它以获取常用的Git功能 . 问题是底层的Git代码在很大程度上依赖于Win32 API文件和文件夹访问,例如 FindFirstFile
, MoveFileEx
,...对于文件和文件夹 stat
, open
,...并且应用程序报告在尝试访问它时拒绝权限 . (该代码适用于应用程序本地存储中的文件夹 . 我还检查过通常 stdio
只在那里工作 . 除此之外不能 fopen
. )
有这个可行的解决方案吗?不应该试图移植 libgit2
所需的所有POSIX . 一方面,它将保证效率低下 . 另一方面,它非常容易出错,例如写 mmap
与 open
配合得很好 . )
1 回答
实现这样的事情是 IMPOSSIBLE !
根据@RobCaplan https://blogs.msdn.microsoft.com/wsdevsol/2012/12/04/skip-the-path-stick-to-the-storagefile/,微软的天才发明了一种安全存储解决方案,既不会让开发人员的生活变得更轻松也更容易:一旦用户授予应用程序
StorageFolder
,应用程序就可以使用提供的StorageFile
API对其造成严重破坏 . 以下代码很乐意清除不幸的用户选择的文件夹 . 恶意应用程序甚至不需要使用Win32 API来执行此操作 . 从逻辑上讲,API不是安全问题的原因 . 现有的UWP Win32 API显然可以正确处理本地存储访问,因此在Win32 API中支持
FutureAccessList
只需要很少的工作量 . 使UWP发展困难的这种愿望必须是有意的 . (毫无疑问,Centenial将会飞行 . 没有人想要从Win32的灵活性转移到UWP监狱 . )EDIT :我应该写的
因为文章确实提出了一个快速而非常聪明的解决方案
所以在我的情况下,每次用户选择一个存储库文件夹时,我都可以将整个文件夹复制到本地存储,对它们进行操作,然后将整个文件复制回原来的位置 . 当然,上面的"the way I wanted"指的是有效的,你不必来回复制东西 .