【问题标题】:StorageFile filled with stream, not replacing the FileStorageFile 填充流,不替换文件
【发布时间】:2015-03-06 15:35:44
【问题描述】:

我在使用 FileSavePicker 时遇到问题。

我一直认为,当您选择现有文件的名称时,FileSavePicker 会替换该文件。它甚至会询问“已经有一些具有该名称的文件,您要替换它吗?”当你点击保存时。

在程序的后续步骤中,我打开 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 作为参数提供给一个新类。使用 iTextSharp 创建一个 pdf 文档。

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

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

感谢您的帮助!

【问题讨论】:

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


【解决方案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();

【讨论】:

  • 您好,感谢您的帮助,但是:FileAccessMode 只允许“Read”和“ReadWrite”。所以没有“写”——我可以使用的文件访问模式。刚刚添加了一张图片来显示没有“写”的可能。
  • 糟糕,这会教我用手机回复 :-)。添加了示例。
猜你喜欢
  • 2012-07-10
  • 1970-01-01
  • 2019-02-10
  • 2014-02-01
  • 2013-12-31
  • 1970-01-01
  • 2014-07-26
  • 2018-11-27
  • 1970-01-01
相关资源
最近更新 更多