StorageFile填充了流,而不是替换File

时间:2015-03-06 15:35:44

标签: c# windows-store-apps itextsharp filesavepicker

我在使用FileSavePicker时遇到问题。

我一直认为,当您选择现有文件的名称时,FileSavePicker将替换该文件。它甚至要求#res;已经有一些带有该名称的文件,你想要替换它吗?"当你点击保存时。

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

所以我的问题是:如何强制执行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作为参数提供给新类。这使用iTextSharp创建了一个pdf文档。

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

所以是的。当新文件比以前大时,它工作正常。 当你到达文件保存选择器时,选择一个文件并单击&#34;保存&#34;它甚至问你,如果你想替换文件,所以我想,它实际上会替换文件......:/

感谢您的帮助!

Possible FileAccessModes

1 个答案:

答案 0 :(得分:1)

您为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();