StorageFile заполнен потоком, не заменяя файл

У меня проблема с использованием FileSavePicker.

Я всегда думал, что FileSavePicker заменит файл, когда вы выбираете имя существующего файла. Он даже спрашивает: "Уже есть какой-то файл с этим именем, вы хотите заменить его?" когда вы нажимаете на сохранить.

На следующих шагах моей программы я открываю StorageFile и записываю в него поток. Моя программа работает нормально, когда новый поток длиннее, чем поток CURRENT, но создает коррумпированные файлы, когда он короче (ну, конечно, оставляя несколько байтов в конце файла, которые не будут перезаписаны или удалены).

Итак, мой вопрос: как применить механизм замены 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 в качестве параметра новому классу. Это создает PDF-документ, используя iTextSharp.

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

Так что да. Он отлично работает, когда новый файл больше предыдущего. Когда вы доберетесь до средства выбора сохранения файла, выберите файл и нажмите "Сохранить", он даже спросит вас, хотите ли вы заменить файл, поэтому я подумал, что он действительно заменит файл...:/

Спасибо за вашу помощь!

Возможные FileAccessModes

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();
Другие вопросы по тегам