积极答复者
FileSavePicker 无法判断被覆盖文件正在被使用?

问题
-
另存为文件,当通过FileSavePicker打开保存文件框,默认名字与原文件名相同,且路径也一样时,不去选择原文件,直接点击保存,通过C++的代码,系统只会弹出一个是否覆盖文件的提示,而检测不到文件正在使用,故而不能给出第二个提示,结果就是原文件清空了,而我们后台这种情况也是不希望覆盖原文件,故而没有操作;但同样的逻辑,C#的代码系统就可以检测文件正在占用
PS:通过C++的代码,系统没有检测到文件正在占用的情况下,我们去给文件写入新的内容,文件也会损坏。
C++ 代码如下
create_task(KnownFolders::DocumentsLibrary->GetFileAsync("test.txt")) .then([=](Windows::Storage::StorageFile^ sotrageFile) { create_task(sotrageFile->OpenAsync(FileAccessMode::ReadWrite)) .then([=](Windows::Storage::Streams::IRandomAccessStream^ writeStream) { auto fileSavePicker = ref new FileSavePicker(); auto fileExtensions = ref new Platform::Collections::Vector<String^>(); fileExtensions->Append(".txt"); fileSavePicker->FileTypeChoices->Insert("txt", fileExtensions); //fileSavePicker->SuggestedSaveFile = storageItem; fileSavePicker->SuggestedFileName = sotrageFile->Name; task<StorageFile^>(fileSavePicker->PickSaveFileAsync()) .then([=](StorageFile^ file) { String^ pathName=file->Path; String^ oldPathName=sotrageFile->Path; if(file!=nullptr) { int i=0; } }); }); });
C#代码如下:
async private void Button_Click_1(object sender, RoutedEventArgs e) { StorageFile openfile = await KnownFolders.DocumentsLibrary.GetFileAsync("test.txt"); await openfile.OpenAsync(FileAccessMode.ReadWrite); FileSavePicker savePicker = new FileSavePicker(); IList<string> plainTextExtensions = new List<string>(); plainTextExtensions.Add(".txt"); savePicker.FileTypeChoices.Add("Plain Text", plainTextExtensions); savePicker.SuggestedFileName = "test.txt"; StorageFile file = await savePicker.PickSaveFileAsync(); if (file != null) { if (file.Name == "test.txt") { return; } else { await FileIO.WriteTextAsync(file, "testtest"); } } } }
同样功能的代码,在C++就检测不到文件已经被占用,当时在C#就可以。
这种情况应该如何修改C++的代码让其可以正常检测文件被占用而不直接破坏原文件呢?
答案
-
Hi,
C#在WinRT中会把错误自动的抛出来,而C++中如果不使用Task的话是没有办法接到抛出来的错误的,你可以试试这样改:
task<StorageFile^>(fileSavePicker->PickSaveFileAsync()) .then([=](Task<StorageFile^> t try { StorageFile^ file=t.get(); } catch() { } )
或者看一看这篇文章:
http://msdn.microsoft.com/en-us/library/windows/apps/Hh780559.aspx
Aaron Xue [MSFT]
MSDN Community Support | Feedback to us
Get or Request Code Sample from Microsoft
Please remember to mark the replies as answers if they help and unmark them if they provide no help.
- 已建议为答案 Damon.Tian 2012年11月22日 1:23
- 已标记为答案 Aaron XueModerator 2012年12月4日 11:00
全部回复
-
顶一下,同求解决办法
- 已建议为答案 Aaron XueModerator 2012年11月21日 9:18
- 取消建议作为答案 Aaron XueModerator 2012年11月21日 9:18
-
Hi,
C#在WinRT中会把错误自动的抛出来,而C++中如果不使用Task的话是没有办法接到抛出来的错误的,你可以试试这样改:
task<StorageFile^>(fileSavePicker->PickSaveFileAsync()) .then([=](Task<StorageFile^> t try { StorageFile^ file=t.get(); } catch() { } )
或者看一看这篇文章:
http://msdn.microsoft.com/en-us/library/windows/apps/Hh780559.aspx
Aaron Xue [MSFT]
MSDN Community Support | Feedback to us
Get or Request Code Sample from Microsoft
Please remember to mark the replies as answers if they help and unmark them if they provide no help.
- 已建议为答案 Damon.Tian 2012年11月22日 1:23
- 已标记为答案 Aaron XueModerator 2012年12月4日 11:00