【问题标题】:Where should my using statements go? And where to place the try catch?我的 using 语句应该去哪里?在哪里放置try catch?
【发布时间】:2011-10-13 11:47:12
【问题描述】:

我刚刚开始使用文件流,虽然我让代码工作了,但我真的很想把它做得漂亮:) 我不知道在哪里放置 using 语句,所以我可以跳过流。关闭(),以及最后如何使用try catch。这是我的代码,不是最漂亮的,但它有效。双文件流用于清除文件。

编辑:抱歉发布代码 sn-p blush 非常糟糕: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);
        }
    } 
}

【问题讨论】:

  • 使用StreamWriter append = false 文件会被自动覆盖,看我的回答

标签: c# try-catch filestream


【解决方案1】:

您不需要多次打开该文件 - 而此时您实际上已打开它 三次 次。这应该没问题; 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/finally - 但为什么呢?如果您无法写入文件,您是否肯定要在此方法中“处理”异常,而不是让它冒泡到调用者?

【讨论】:

  • ... 对于catch 块的问题,您(@Daniela)可能不想处理SaveFileAsTxt 中的任何错误,但在更高级别,所以我' d 不要在这里使用任何try catch。 (在编辑答案时写;-))
【解决方案2】:

首先,我不明白这么多流的用途,但你可以在很多地方使用 using:

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

        };
    }
}

【讨论】:

    【解决方案3】:

    你可以先跳过两个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 确定是否将数据附加到 文件。如果文件存在且 append 为 false,则覆盖该文件。 如果文件存在且 append 为真,则数据将附加到 文件。 否则,将创建一个新文件

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

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

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

    【讨论】:

      【解决方案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);
              }
          }
      }
      

      但我不知道你为什么打开第一个文件。
      关于第二个,我相信您尝试使用这种方法创建文件,
      但也有其他方法可以做到这一点。

      【讨论】:

        【解决方案5】:
        // 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);
               }
        }
        

        【讨论】:

        • 欢迎使用 StackOverflow! 请正确格式化您的帖子。 在每行代码前添加 4 个空格。更多信息here.
        【解决方案6】:

        为了与众不同,我将使用 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 的字符串(使用string.Format 格式化) `

        【讨论】:

        • 我喜欢使用linq! p 应该是装运吧?林克很酷!感谢您抽出宝贵时间帮助我:)
        • @Daniela 这是您的收藏,名为_shipments
        猜你喜欢
        • 2015-02-08
        • 2022-01-13
        • 1970-01-01
        • 2010-10-06
        • 2021-01-27
        • 2011-09-02
        • 1970-01-01
        • 2016-07-02
        • 1970-01-01
        相关资源
        最近更新 更多