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());
Так что да. Он отлично работает, когда новый файл больше предыдущего. Когда вы доберетесь до средства выбора сохранения файла, выберите файл и нажмите "Сохранить", он даже спросит вас, хотите ли вы заменить файл, поэтому я подумал, что он действительно заменит файл...:/
Спасибо за вашу помощь!
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();