为什么 FileSavePicker 不替换文件?
Why FileSavePicker is not replacing file?
当我使用 FileSavePicker select(或创建)存储文件时,如果我 select 现有文件,它会提示替换。当我按“是”时,我希望文件稍后会被替换,但事实并非如此。
// existing file is picked, I pressed yes when replace was requested.
file = await picker.PickSaveFileAsync();
所以使用上面的代码,现有文件由 FileSavePicker 选择,我预计 file
现在已被替换,但它没有。
await file.OpenAsync(FileAccessMode.ReadWrite, StorageOpenOptions.AllowOnlyReaders)
这只会打开文件进行写入,不会替换它,但我希望它被替换。我的问题与 相同,但我不是在写文本文件,而是在写二进制数据。
如何用新的替换 file
?
我试过以下但它抛出 NRE,因为 GetParentAsync 返回 null。
var file = await (await file.GetParentAsync()).CreateFileAsync(file.Name,
CreationCollisionOption.ReplaceExisting);
我不希望用户通过删除旧文件并创建新文件来明确创建新文件。我想要的是,如果用户 select 的现有文件并接受来自 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();
}
}
运行这两次,在第一次运行,创建文件。在第二个 运行 select 现有文件中,并将 Repeat<byte>(10, 10000)
更改为更小和不同的内容,例如 Repeat<byte>(80, 50)
并检查文件内容。
您始终可以先将打开的流 SetLength 设置为 0 - 这将清除所有旧内容并将流的位置设置为 0。之后您可以将新内容写入流:
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();
}
当我使用 FileSavePicker select(或创建)存储文件时,如果我 select 现有文件,它会提示替换。当我按“是”时,我希望文件稍后会被替换,但事实并非如此。
// existing file is picked, I pressed yes when replace was requested.
file = await picker.PickSaveFileAsync();
所以使用上面的代码,现有文件由 FileSavePicker 选择,我预计 file
现在已被替换,但它没有。
await file.OpenAsync(FileAccessMode.ReadWrite, StorageOpenOptions.AllowOnlyReaders)
这只会打开文件进行写入,不会替换它,但我希望它被替换。我的问题与
如何用新的替换 file
?
我试过以下但它抛出 NRE,因为 GetParentAsync 返回 null。
var file = await (await file.GetParentAsync()).CreateFileAsync(file.Name,
CreationCollisionOption.ReplaceExisting);
我不希望用户通过删除旧文件并创建新文件来明确创建新文件。我想要的是,如果用户 select 的现有文件并接受来自 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();
}
}
运行这两次,在第一次运行,创建文件。在第二个 运行 select 现有文件中,并将 Repeat<byte>(10, 10000)
更改为更小和不同的内容,例如 Repeat<byte>(80, 50)
并检查文件内容。
您始终可以先将打开的流 SetLength 设置为 0 - 这将清除所有旧内容并将流的位置设置为 0。之后您可以将新内容写入流:
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();
}