为什么FileSavePicker没有替换文件?

时间:2017-09-30 11:29:06

标签: c# uwp filesavepicker

当我使用FileSavePicker选择(或创建)存储文件时,如果我选择现有文件,则会提示替换。当我按是,我希望以后更换文件,但它没有。

// existing file is picked, I pressed yes when replace was requested.
file = await picker.PickSaveFileAsync();

因此,使用上面的代码,FileSavePicker会选择现有文件,我预计file现在已被替换但不是。

await file.OpenAsync(FileAccessMode.ReadWrite, StorageOpenOptions.AllowOnlyReaders)

这只会打开文件进行写入,它不会替换它,但我希望它被替换。我的问题与this question相同,但我没有写文本文件,我正在编写二进制数据。

如何用新的替换file

我尝试过关注但它会抛出NRE,因为GetParentAsync返回null。

var file = await (await file.GetParentAsync()).CreateFileAsync(file.Name,
                        CreationCollisionOption.ReplaceExisting);

我不希望用户通过删除旧文件并创建新文件来显式创建新文件。我想要的是,如果用户选择现有文件并接受来自FileSavePicker的替换请求,则应该替换该文件。

好的,这是您可以在计算机上测试的代码。

var picker = new FileSavePicker
{
    SuggestedStartLocation = PickerLocationId.Desktop,
    DefaultFileExtension = ".bin",
    SuggestedFileName = "Binary file"
};
picker.FileTypeChoices.Add("Binary File", new List<string> {".bin"});

// in second run, choose existing file.
var file = await picker.PickSaveFileAsync();

using (var stream = await file.OpenAsync(FileAccessMode.ReadWrite, StorageOpenOptions.AllowOnlyReaders))
{
    using (var output = stream.GetOutputStreamAt(0))
    {
        using (var writer = new DataWriter(output))
        {
            writer.WriteBytes(Enumerable.Repeat<byte>(10, 10000).ToArray());
            await writer.StoreAsync();
            writer.DetachStream();
        }
        await output.FlushAsync();
    }
}

在第一次运行中运行两次,创建文件。在第二次运行中选择现有文件,并将Repeat<byte>(10, 10000)更改为更小和不同的内容,例如Repeat<byte>(80, 50)并检查文件内容。

1 个答案:

答案 0 :(得分:1)

您首先可以将已打开的流的SetLength设置为0 - 这将清除所有旧内容并将流的位置设置为0.之后您可以只向流写入新内容:< / p>

var picker = new FileSavePicker
{
    SuggestedStartLocation = PickerLocationId.Desktop,
    DefaultFileExtension = ".bin",
    SuggestedFileName = "Binary file"
};
picker.FileTypeChoices.Add("Binary File", new List<string> { ".bin" });
var file = await picker.PickSaveFileAsync();

using (var stream = await file.OpenStreamForWriteAsync())
{
    stream.SetLength(0);
    var bytes = Encoding.ASCII.GetBytes("Content");
    await stream.WriteAsync(bytes, 0, bytes.Length);
    await stream.FlushAsync();
}