2011-10-13 55 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)。 –