2011-10-13 80 views
2

我剛剛開始使用filestream,雖然我讓代碼工作,但我真的很喜歡它:)我不知道在哪裏放置使用語句,所以我可以跳過stream.Close( )以及如何最終使用try catch。這裏是我的代碼,不是最漂亮的東西,但它的工作原理。雙文件流用於清除文件。我的使用語句應該放在哪裏?試試抓住哪裏?

編輯:對不起張貼的代碼片段臉紅這是很糟糕的:P我已經張貼了我的第二次嘗試:)

internal static void SaveFileAsTxt() 
{ 
    FileStream streamer = new FileStream("Shipping2.txt", FileMode.Append, FileAccess.Write, FileShare.Write); 
    streamer.Close(); 

    FileStream f = File.Open("Shipping2.txt", FileMode.Create); 
    f.Close(); 

    StreamWriter writer = new StreamWriter("Shipping2.txt", true, Encoding.ASCII); 

    foreach (var shipment in _shipments) 
    { 
     string write = (shipment.Distance + ","+ shipment.Distance).ToString(); 
     writer.WriteLine(write); 

    }; 

     writer.Close(); 
} 


//--------new code-------- 


internal static void SaveFileAsTxt() 
{ 
    if (File.Exists("Shipping2.txt")) 
    { 
     File.Delete("Shipping2.txt"); 
    } 

    using (StreamWriter writer = new StreamWriter("Shipping2.txt", true, Encoding.ASCII)) 
    { 
     foreach (var shipment in _shipments) 
     { 
      string write = (shipment.Duration + ","+ shipment.Distance).ToString(); 
         writer.WriteLine(write); 
     } 
    } 
} 
+0

將被自動覆蓋,看到我的回答 – sll

回答

4

您不必打開文件不止一次 - 而你實際上打開它三個次。這應該沒問題; File.CreateText將截斷文件,如果它已經存在,否則創建:

// Are you *sure* you want to use ASCII? UTF-8 might be a better bet... 
using (TextWriter writer = File.CreateText("Shipping2.txt", Encoding.ASCII)) 
{ 
    foreach (var shipment in _shipments) 
    { 
     // Removed redundant ToString call, and elided local variable. 
     // Consider using a format string instead: 
     // writer.WriteLine("{0},{1}", shipment.Distance, shipment.Distance); 
     writer.WriteLine(shipment.Distance + "," + shipment.Distance); 
    } 
    // Removed empty statement (trailing semi-colon) 
} 

現在,你說你要使用的try/catch /終於 - 但爲什麼呢?如果你不能寫入文件,你是否確實想用這種方法「處理」異常,而不是讓它冒泡給調用者?

+0

和... ...的問題'catch'塊,你(@Daniela)可能不想處理'SaveFileAsTxt'中的任何錯誤,但是在更高層次上,所以我不會在這裏使用任何'try catch'。 (寫回答被編輯;-)) – ordag

1

您可以跳過兩個第一FileStreams,只使用StreamWriter,它會爲你創建一個文件:

// Single using 
using (StreamWriter writer = new StreamWriter(
              "Shipping2.txt", 
              true, // !!! 
              Encoding.ASCII)) 
{ 
     foreach (var shipment in _shipments) 
     { 
      string write = (shipment.Distance + "," + shipment.Distance) 
          .ToString(); 
      writer.WriteLine(write); 
     } 
} 

MSDN:

public StreamWriter(
    string path, 
    bool append, 
    Encoding encoding 
) 

追加

類型:System .Boolean確定數據是否爲被附加到 文件。如果文件存在並且追加爲false,則該文件被覆蓋。 如果文件存在且附加爲真,則數據將附加到 文件中。 否則,將創建一個新文件

編輯:關於更新的問題(第二部分)

你並不需要手動刪除文件,只需指定追加在StreamWriter構造=假,它會覆蓋文件:

如果文件存在,並且append爲false,則文件被覆蓋

0

眼下,鱈魚è您已是相同的:

internal static void SaveFileAsTxt() { 
    using (FileStream streamer = new FileStream(
     "Shipping2.txt", FileMode.Append, FileAccess.Write, FileShare.Write 
    );) {} 

    using(FileStream f = File.Open("Shipping2.txt", FileMode.Create)) {} 

    using(StreamWriter writer = 
     new StreamWriter("Shipping2.txt", true, Encoding.ASCII)) { 

     foreach (var shipment in _shipments) { 
      string write = (shipment.Distance + "," + shipment.Distance).ToString(); 
      writer.WriteLine(write); 
     } 
    } 
} 

但我不知道爲什麼你打開的第一個文件。
對於第二個,我相信你試圖用這種方法創建文件,
但也有其他的方法來做到這一點。

1

首先,我不明白這麼多數據流的使用,但你可以使用使用了一些地方:

internal static void SaveFileAsTxt() 
{ 
    using(var streamer = new FileStream("Shipping2.txt", FileMode.Append, FileAccess.Write, FileShare.Write)) 
    { 

    } 

    using(var f = File.Open("Shipping2.txt", FileMode.Create)) 
    { 

    } 

    using(var writer = new StreamWriter("Shipping2.txt", true, Encoding.ASCII)) 
    { 
     foreach (var shipment in _shipments) 
     { 
      string write = (shipment.Distance + ","+ shipment.Distance).ToString(); 
      writer.WriteLine(write); 

     }; 
    } 
} 
0

只要是不同的,我將使用LINQ :-)

File.WriteAllLines(
    "Shipping2.txt", 
    _shipments.Select(
     p => string.Format(
      "{0},{1}", 
      shipment.Distance, 
      shipment.Distance) 
    ), 
    Encoding.ASCII); 

該版本需要.NET 4.0。 File.WriteAllLines將創建該文件,寫入所有行並關閉文件。 _shipments.Select(p => string.Format("{0},{1}", shipment.Distance, shipment.Distance))將返回,爲_shipments每個元素,包含shipment.Distance + "," + shipment.Distance一個字符串中使用的StreamWriter追加=假文件(使用string.Format格式) `

+0

我喜歡使用LINQ! p應該是正確的發貨? Linq很酷!感謝您抽出寶貴時間來幫助我:) –

+0

@Daniela這是您的集合,稱爲'_shipments'。 – xanatos

0
// Single using 
using (StreamWriter writer = new StreamWriter(
              "Shipping2.txt", 
              true, // !!! 
              Encoding.ASCII)) 
{ 
     foreach (var shipment in _shipments) 
     { 
      string write = (shipment.Distance + "," + shipment.Distance) 
          .ToString(); 
      writer.WriteLine(write); 
     } 
} 
+0

**歡迎使用StackOverflow!**請正確格式化您的帖子。 **在每行代碼**之前添加4個空格。更多信息[here](http://stackoverflow.com/editing-help)。 –