C# 我的using语句应该去哪里?在哪里放置试捕器?

C# 我的using语句应该去哪里?在哪里放置试捕器?,c#,try-catch,filestream,C#,Try Catch,Filestream,我刚刚开始使用filestream,虽然我让代码工作了,-但我真的很想让它工作得更好:)我不知道在哪里放置using语句,这样我就可以跳过stream.Close(),以及如何最终使用try-catch。这是我的代码,不是最漂亮的东西,但它是有效的。双文件流用于清除文件 编辑:很抱歉发布了那个代码片段,这太糟糕了:p我已经发布了我的第二次尝试:) 您不需要多次打开该文件,实际上您现在正在打开它三次。这应该是好的;如果文件已存在,将截断该文件,否则将创建该文件: // Are you *sure*

我刚刚开始使用filestream,虽然我让代码工作了,-但我真的很想让它工作得更好:)我不知道在哪里放置using语句,这样我就可以跳过stream.Close(),以及如何最终使用try-catch。这是我的代码,不是最漂亮的东西,但它是有效的。双文件流用于清除文件

编辑:很抱歉发布了那个代码片段,这太糟糕了:p我已经发布了我的第二次尝试:)


您不需要多次打开该文件,实际上您现在正在打开它三次。这应该是好的;如果文件已存在,将截断该文件,否则将创建该文件:

// 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/finally,但是为什么呢?如果无法写入文件,是否确实要在此方法中“处理”异常,而不是让调用方看到异常?

您可以跳过前两个
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);
       }
}

追加

类型:System.Boolean确定是否将数据追加到 文件如果文件存在且append为false,则会覆盖该文件。 如果文件存在且append为true,则将数据追加到 文件否则,将创建一个新文件

编辑:关于更新的问题(第二部分)

您不需要手动删除文件,只需在StreamWriter的构造函数中指定append=false,它将覆盖一个文件:

如果文件存在且append为false,则会覆盖该文件


现在,您拥有的代码相当于:

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);
        }
    }
}
但我不知道你为什么打开第一个文件。
关于第二个,我相信您尝试使用此方法创建文件,

但是也有其他方法可以做到这一点。

首先,我不了解这么多流的用途,但您可以在许多地方使用:

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);

        };
    }
}

为了与众不同,我将使用LINQ:-)

此版本需要.NET 4.0<代码>文件。WriteAllines将创建文件,写入所有行并关闭文件<代码>\u装运。选择(p=>string.Format(“{0},{1}”,shipping.Distance,shipping.Distance))将为
\u装运的每个元素返回一个字符串,其中包含
shipping.Distance+”,“+shipping.Distance
(使用
string.Format
格式化)
`

。。。对于
catch
块的问题,您(@Daniela)可能不想处理
SaveFileAsTxt
中的任何错误,但是在更高的级别上,因此我不会在这里使用任何
try catch
。(在编辑答案时编写;-)使用StreamWriter append=false文件将自动覆盖,请参阅我的答案我喜欢使用linq!p应该是装运的,对吗?林克很酷!感谢您抽出时间来帮助我:)@Daniela这是您的收藏,名为
\u shippings
。欢迎来到StackOverflow!请正确格式化你的帖子。在每行代码前添加4个空格。更多信息。
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);
        }
    }
}
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);

        };
    }
}
File.WriteAllLines(
    "Shipping2.txt", 
    _shipments.Select(
        p => string.Format(
            "{0},{1}", 
            shipment.Distance, 
            shipment.Distance)
    ),
    Encoding.ASCII);
// 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);
       }
}