none
FileSavePicker 无法判断被覆盖文件正在被使用? RRS feed

  • 问题

  • 另存为文件,当通过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++的代码让其可以正常检测文件被占用而不直接破坏原文件呢?

    2012年11月20日 2:08

答案

全部回复