在 UWP 中移动和替换另一个文件后如何修改文件?

Posted

技术标签:

【中文标题】在 UWP 中移动和替换另一个文件后如何修改文件?【英文标题】:How can you modify a file after move and replacing another in UWP? 【发布时间】:2018-09-02 04:38:20 【问题描述】:

在 UWP 中调用 MoveAndReplaceAsync 将旧文件替换为新文件后,我无法修改新文件。

例如这里我打开一个文件保存在_file

private async void OpenButton_Click(object sender, RoutedEventArgs e)
    
        var picker =
            new Windows.Storage.Pickers.FileOpenPicker
            
                ViewMode = Windows.Storage.Pickers.PickerViewMode.Thumbnail,
                SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.DocumentsLibrary
            ;
        picker.FileTypeFilter.Add(".txt");

        _file = await picker.PickSingleFileAsync();
    

在这个处理程序中,我将其写入一个新文件,将其移动并替换到打开的文件上,然后尝试追加。

    private async void MoveAndReplaceAndAppend_Click(object sender, RoutedEventArgs e)
    
        // Create a temp file for writing to
        var tempFolder = ApplicationData.Current.TemporaryFolder;
        var filename = Guid.NewGuid().ToString();
        var tmpFile = await tempFolder.CreateFileAsync(filename, CreationCollisionOption.GenerateUniqueName);

        try
        
            var stream = await tmpFile.OpenAsync(FileAccessMode.ReadWrite);
            var dw = new DataWriter(stream);
            dw.WriteString("New file");
            await tmpFile.MoveAndReplaceAsync(_file);
        
        catch (Exception ex)
        
            var dlg = new MessageDialog($"Error while move and replacing ex.Message");
            await dlg.ShowAsync();
        

        var failures = "";
        try
        
            await FileIO.AppendTextAsync(_file, "testing");
        
        catch (Exception ex)
        
            failures += $"Failed appending to _file: ex.Message\n";
        

        try
        
            await FileIO.AppendTextAsync(tmpFile, "testing");
        
        catch (Exception ex)
        
            failures += $"Failed appending to tmpFile: ex.Message\n";
        

        var errorDialog = new MessageDialog($"Error while appending\nfailures");
        await errorDialog.ShowAsync();
    

我尝试添加新旧StorageFile,但总是出现以下错误。

Failed appending to _file: The process cannot access the file because it is being used by another process.

Failed appending to tmpFile: The process cannot access the file because it is being used by another process.

【问题讨论】:

我发现了一些奇怪的行为。如果我在写入临时文件后调用stream.Dispose(),那么它会按我的预期工作。这不应该是必要的,对吧? 是的。你必须在使用它们后关闭你的文件流。否则文件保持锁定 为什么它们超出范围时不自动关闭? 哦,所以这些类型需要一个 using 块,对吧? 我想知道为什么我在 UWP 应用程序中没有收到此警告 docs.microsoft.com/en-us/visualstudio/code-quality/… 【参考方案1】:

问题是前一个流的生命周期在替换操作之前没有结束。您可以使用Dispose() 手动管理输出流的生命周期。

var stream = await tmpFile.OpenAsync(FileAccessMode.ReadWrite);
var dw = new DataWriter(stream);
dw.WriteString("New file");
stream.Dispose();

为什么它们在超出范围时不自动关闭?

不必手动管理输出流的生命周期。您还可以使用 using 语句来管理流的生命周期。

using (var stream = await tmpFile.OpenAsync(FileAccessMode.ReadWrite))

    var dw = new DataWriter(stream);
    dw.WriteString("New file");

当执行离开 using 语句时,流将自动释放。更多内容可以参考UWP File access permissions。

【讨论】:

以上是关于在 UWP 中移动和替换另一个文件后如何修改文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何更改UWP app文件夹名称或路径?

如果打包 UWP,Visual Studio 总是重建解决方案

Linux下移动了数据库 pgsql目录到另一个文件下,恢复后,启动服务提示无

如何从我的 html 文件移动到另一个 html 文件以创建 iOS 混合应用程序?

UWP DEP0700: 应用程序注册失败。[0x80073CF9] 另一个用户已安装此应用的未打包版本。当前用户无法将该版本替换为打包版本。

另一个进程错误正在使用 UWP StorageFile 文件