Добавьте одну строку в начало текстового файла - PullRequest
5 голосов
/ 23 ноября 2011

Мое приложение извлекает данные и добавляет их в текстовый файл, но мне нужно выяснить, как программно посмотреть на первую строку текстового файла и посмотреть, соответствует ли он следующему тексту:

DateTime, VirtualIP, VirtualPort, VirtualName, DestinationIP, DestPort, состояние, Желаемая

Если это произойдет, то продолжайте выполнять обычную функцию (фрагмент ниже), если первая строка отличается от описанной выше, тогда я хочу вставить вышеприведенное в первую строку, не перезаписывая то, что в данный момент существует. Как я могу это сделать? (по сути, нажимая все на одну строку вниз, чтобы я мог добавить то, что я хочу в первой строке) ... кстати, это сохраняется как файл CSV, который можно открыть в Excel.

try
{
    // ...
    for (int j = 0; j < memberStatus.Result.Count; j++)
    {
        VirtualMemberStatus status = memberStatus.Result[j];

        //text += String.Format("Name: {4}, Member: {0}:{1}, Status: {2}, Desired: {3}" + Environment.NewLine, status.Member.Address, status.Member.Port, status.EffectiveStatus, status.DesiredStatus, virtualKey.Key);
        text += String.Format("{5},{4},{0},{1},{2},{3}" + Environment.NewLine, status.Member.Address, status.Member.Port, status.EffectiveStatus, status.DesiredStatus, virtualKey.Key.Replace(":", ","), DateTime.UtcNow);
    }
}
catch
{
    //ERROR CODE 2
    //MessageBox.Show("Error occurred, check device name (case senstive) and admin group. This error may also occur due to connection loss, try again.");
    errors += String.Format("{0} Error Code: 2, Error occurred, check device name (case senstive) and admin group. This error may also occur due to connection loss, try again." + Environment.NewLine, DateTime.UtcNow);

}

this.resultsTextBox.Text = text;

Этот файл не удаляется много, но в случае, если он хочет, чтобы у него были правильные имена столбцов в верхней части. то есть:

DateTime,VirtualIP,VirtualPort,VirtualName,DestinationIP,DestPort,Status,Desired

Ответы [ 2 ]

8 голосов
/ 23 ноября 2011

Вам нужно переписать весь файл.

  1. открыть новый (временный!) Файл
  2. строка заголовка записи
  3. для каждой строки ввода, строка записи (рассмотрим буферизацию блока, если производительность имеет значение)
  4. очистить и закрыть выходной файл
  5. ТОЛЬКО если ошибок не было, переместите временный файл на место (переименовав).

Эта процедура может предотвратить проблемы, еслив середине процесса возникает ошибка (IO)

Вот код, позволяющий сделать это:

using (var input = new StreamReader("input.txt"))
    using (var output = new StreamWriter("input.txt.temp"))
{
    output.WriteLine("headerline"); // replace with your header :)

    var buf = new char[4096];
    int read = 0;
    do 
    {
        read = input.ReadBlock(buf, 0, buf.Length);
        output.Write(buf, 0, read);
    } while (read > 0);

    output.Flush();
    output.Close();
    input.Close();
}

File.Replace("input.txt.temp", "input.txt", "input.txt.backup");

Обратите внимание, что в примере кода даже создается резервная копия.Одним из возможных улучшений было бы явное создание экземпляра FileStream(...., FileMode.CreateNew), чтобы предотвратить перезапись временного файла, если файл с таким именем уже существует.

Другим решением будет использование System.IO.Path.GetTempFileName().Однако тогда File.Replace может перестать быть эффективным и атомарным, поскольку временная папка может находиться в другом томе / файловой системе.

0 голосов
/ 23 ноября 2011

вам нужно выполнить поиск по первой позиции, чтобы увидеть, соответствует ли оно этим словам, этот фрагмент кода может достичь того, что вы ищете.

    Dim filePath As String = "file.txt"
    Dim bufferSize As Integer = 8129

    Dim textToMatch As String = "DateTime,VirtualIP,VirtualPort,VirtualName,DestinationIP,DestPort,Status,Desired"
    Dim textByte As Byte() = ASCIIEncoding.ASCII.GetBytes(text)

    Dim buffer As Byte() = Nothing

    Dim fs As FileStream = File.Open(filePath, FileMode.Open, FileAccess.ReadWrite)
    fs.Read(buffer, 0, bufferSize)


    Dim i As Int32 = fs.Seek(0, SeekOrigin.Begin)
    fs.Position = i

    If fs.Position.Equals(textToMatch) Then

    Else
        fs.Write(textByte, 0, textByte.Length)
    End If

    fs.Flush()
    fs.Close()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...