StorageFile 填充流,而不是替换文件

StorageFile filled with stream, not replacing the File

我在使用 FileSavePicker 时遇到问题。

我一直以为,当您选择现有文件的名称时,FileSavePicker 会替换该文件。当您点击保存时,它甚至会询问 "theres already some file with that Name, do you want to replace it?"。

在程序的后续步骤中,我打开 StorageFile 并向其写入一个流。 我的程序工作得很好,当新流比当前流长时,但会创建损坏的文件,当它更短时(当然会在文件末尾留下一些不会被覆盖或删除的字节)。

所以我的问题是:如何实施 FileSavePicker 的替换机制?

FileSavePicker filePicker = new FileSavePicker();
filePicker.SuggestedFileName = "Some File Name";
filePicker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary;
filePicker.FileTypeChoices.Add("Pdf File", new List<string>(){ ".pdf" });
StorageFile saveFile = await filePicker.PickSaveFileAsync();

然后我会将 SaveFile 作为参数提供给新的 class。使用 iTextSharp 创建 pdf 文档。

var stream = await saveFile.OpenAsync(FileAccessMode.ReadWrite);       
doc = new Document();
writer = new PdfCopy(doc, stream.AsStream());

是的。当新文件比以前的文件大时,它工作正常。 当您到达文件保存选择器时,选择一个文件并单击 "Save" 它甚至会询问您是否要替换文件,所以我想,它实际上会替换文件... :/

感谢您的帮助!

你为 ReadWrite 打开它,它保留了以前的内容。为了截断您需要转换为 FileRandomAccessStream 然后将 Size 设置为零:

var picker = new FileOpenPicker();
picker.FileTypeFilter.Add(".txt");
var file = await picker.PickSingleFileAsync();
var stream = (await file.OpenAsync(FileAccessMode.ReadWrite)) as FileRandomAccessStream;
stream.Size = 0;
var writer = new DataWriter(stream.GetOutputStreamAt(0));
writer.WriteString("Hello\r\n");
await writer.StoreAsync();