2016-03-07 79 views
2

我試圖用FileSavePicker覆蓋UWP中的當前文件。我refered這樣:https://msdn.microsoft.com/zh-cn/windows/uwp/files/quickstart-reading-and-writing-files 但當我使用更短的文件覆蓋一個較長的文件,還有了一個問題:舊文件(長)的額外部分沒有被刪除,就像這樣:如何在UWP中覆蓋文件?

舊文件:

abcdefg 

和文件我想保存:

hij 

但保存操作後,我得到這個:

hijdefg 

我的代碼是在這裏:

 private async void Save_Click(object sender, RoutedEventArgs e) 
    { 
     XmlDocument Line = SaveToXml(); 

     //Save it 
     FileSavePicker fileSaving = new FileSavePicker(); 
     fileSaving.SuggestedStartLocation = PickerLocationId.DocumentsLibrary; 
     fileSaving.SuggestedFileName = "NewLine"; 
     fileSaving.FileTypeChoices.Add("Simple Line Files", new List<string>() { ".Line" }); 
     StorageFile file = await fileSaving.PickSaveFileAsync(); 

     if (file != null) 
     { 
      CachedFileManager.DeferUpdates(file); 
      var stream = await file.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite); 
      //var stream = await file.OpenStreamForWriteAsync(); 
      using (var outputStream = stream.GetOutputStreamAt(0)) 
      { 
       using (var dataWriter = new Windows.Storage.Streams.DataWriter(outputStream)) 
       { 
        string xmlDoc = Line.OuterXml; 
        Debug.WriteLine(Line.OuterXml); 
        dataWriter.WriteString(xmlDoc); 
        await dataWriter.StoreAsync(); 
        await outputStream.FlushAsync(); 
       } 
      } 
      stream.Dispose(); 
     } 
    } 

感謝您幫助我!

+1

似乎是一種正常行爲。如果你想用全新的數據覆蓋文件,爲什麼不只是用* ReplaceExisting *選項創建文件而不是打開一箇舊文件? – Romasz

+2

錯誤的方法,你想創建而不是打開。 –

回答

2

您的代碼var outputStream = stream.GetOutputStreamAt(0)在文件流的開始位置返回輸出流。 現在,當您寫入文件時,它會從您設置的位置替換文件。當您要寫入的新字符串小於文件中的舊字符串時,它不能替換所有舊字符串。所以使用這種方法,你不能確保每個字母都可以在舊文件中被替換。

您可以使用FileIO.WriteTextAsync(IStorageFile, String)方法將文本寫入指定的文件。它可以覆蓋舊文件。

例如:

private async void Save_Click(object sender, RoutedEventArgs e) 
{ 
    FileSavePicker savePicker = new FileSavePicker(); 
    savePicker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary; 
    savePicker.FileTypeChoices.Add("Simple Line Files", new List<string>() { ".line" }); 
    savePicker.SuggestedFileName = "NewLine"; 
    StorageFile file = await savePicker.PickSaveFileAsync(); 
    if (file != null) 
    { 
     CachedFileManager.DeferUpdates(file); 
     await FileIO.WriteTextAsync(file, "hello"); 
     FileUpdateStatus status = await CachedFileManager.CompleteUpdatesAsync(file); 
    } 
} 
+0

如果我不寫文字會怎麼樣?我正在使用datawriter,如何解決這個問題? –

0

在調用OpenStreamForWriteAsync()的使用FileIO.WriteBytesAsync和寫入一個零字節數組。這將清除文件。

public async Task<Stream> ClearAndGetStream(StorageFile storageFile) 
{ 
    await FileIO.WriteBytesAsync(storageFile, new byte[0]); 
    return await storageFile.OpenStreamForWriteAsync(); 
}