Где должны быть мои операторы использования?А где разместить попробовать поймать? - PullRequest
2 голосов
/ 13 октября 2011

Я только начал использовать файловый поток, и хотя я заставил код работать, - мне бы очень хотелось, чтобы он тоже был хорош :) Я понятия не имею, где разместить операторы using, чтобы я мог пропустить поток. (), и как использовать try catch наконец. вот мой код, не самая красивая вещь, но она работает. Двойной файловый поток используется для очистки файла.

Редактировать: извините за публикацию этого фрагмента кода 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);
        }
    } 
}

Ответы [ 6 ]

4 голосов
/ 13 октября 2011

Вам не нужно открывать файл более одного раза - и вы фактически открываете его три раза в данный момент. Это должно быть хорошо; 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 - но почему? Если вам не удалось записать файл, вы определенно хотите «обработать» исключение в этом методе, вместо того, чтобы позволить ему всплыть перед вызывающей стороной?

1 голос
/ 13 октября 2011

Во-первых, я не понимаю использования для стольких потоков, но вы можете использовать use в нескольких местах:

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

        };
    }
}
1 голос
/ 13 октября 2011

Вы можете пропустить два первых 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 is true, данные добавляются к файл. В противном случае создается новый файл .

РЕДАКТИРОВАТЬ: Относительно обновленного вопроса (вторая часть)

Вам не нужно удалять файл вручную, просто укажите append = false в конструкторе StreamWriter, и файл будет перезаписан:

Если файл существует, а append имеет значение false, файл перезаписывается

0 голосов
/ 13 октября 2011
// 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 голосов
/ 13 октября 2011

Просто чтобы быть другим, я буду использовать 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) `

0 голосов
/ 13 октября 2011

Прямо сейчас, ваш код эквивалентен этому:

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

Но я не знаю, почему вы открыли первый файл.
Что касается второго, я думаю, что вы пытались создать файл, используя этот метод,
но есть и другие способы сделать это.

...