2015-03-06 3 views
0

У меня проблема с использованием FileSavePicker.StorageFile заполнен потоком, не заменяя файл

Я всегда думал, что 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()); 

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

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

Possible FileAccessModes

+0

Я отредактированный свой титул. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

ответ

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(); 
+0

Эй, спасибо за вашу помощь, но: FileAccessMode позволяет только «Читать» и «ReadWrite». Поэтому theres no «Write» - режим доступа к файлам, который я мог бы использовать. Просто добавил изображение, чтобы показать theres no «Write». – HideAndSeek

+0

Ooops, это научит меня отвечать с моего телефона :-). Добавлен образец. –

+0

Спасибо, это работает и помогает. – HideAndSeek

Смежные вопросы