首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么FileSavePicker不替换文件?

为什么FileSavePicker不替换文件?
EN

Stack Overflow用户
提问于 2017-09-30 11:29:05
回答 1查看 392关注 0票数 2

当我使用FileSavePicker选择(或创建)存储文件时,如果我选择现有文件,它将提示进行替换。当我按“是”时,我希望稍后会替换该文件,但它没有。

代码语言:javascript
复制
// existing file is picked, I pressed yes when replace was requested.
file = await picker.PickSaveFileAsync();

所以使用上面的代码,现有的文件是由FileSavePicker选择的,我预计file现在被替换了,但它没有被替换。

代码语言:javascript
复制
await file.OpenAsync(FileAccessMode.ReadWrite, StorageOpenOptions.AllowOnlyReaders)

这将只打开文件的写,它没有取代它,但我希望它被替换。我的问题与这个问题相同,但我不是在编写文本文件,而是编写二进制数据。

如何将file替换为新的?

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

代码语言:javascript
复制
var file = await (await file.GetParentAsync()).CreateFileAsync(file.Name,
                        CreationCollisionOption.ReplaceExisting);

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

好的,这是你可以在机器上测试的代码。

代码语言:javascript
复制
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)和检查文件的内容。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-30 18:51:10

您可以首先将打开的流的SetLength设置为0 --这将清除所有旧内容,并将流的位置设置为0。之后,您只需将您的新内容写入流:

代码语言:javascript
复制
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();
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46502263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档