2016-11-08 5 views
-2

Мой код отлично работает для создания файла, если он не существует и вставляет новый текст, или если файл уже существует, он перезаписывает текущее содержимое.C# - Как создать файл, если он еще не существует и добавить новый текст?

path = @"C:\MY FOLDER\data.txt"; 

FileStream fileS = null; 

bool done = false; 

while (!done) 
{ 
    done = true; 

    try 
    { 
     FileStream fileStream = File.Open(path, FileMode.OpenOrCreate); 
     fileStream.SetLength(0); 
     fileStream.Close(); 
     fileS = File.OpenWrite(path); 
    } 
    catch (IOException ex) 
    { 
     done = false; 
     // Thread.Sleep(3); 
    } 
}  

using (StreamWriter fs = new StreamWriter(fileS)) 
{ 
    fs.Write(textA); 
    fs.Close(); 
}; 

fileS.Dispose(); 

Теперь мне нужно изменить его так, он больше не перезаписывает содержимое, но вместо того, чтобы добавить новый текст к предыдущему содержимому. Во-вторых, мне нужно знать, является ли файл полностью пустым, и в этом случае вставьте textA, или если есть уже некоторое содержимое, и в этом случае добавьте textB.

+0

Если это просто создание текстовых файлов, то 'File.AppendAllText (путь, текст);' делает все это для вас без суеты. Чтобы проверить, пустой ли файл, длина его в байтах, 0 пуст. – Equalsk

+0

fileS = File.AppendAllText (путь, textA); throws error: Невозможно неявно преобразовать тип 'void' в 'System.IO.FileStream' – Totallama

+0

Вы не можете просто выбросить код, который я предложил, в середину существующего метода и ожидать, что он будет работать. Идите и прочитайте о методе и о том, как его использовать и правильно его реализовать. – Equalsk

ответ

1

Попробуйте

 string path = @"Your File Path"; 

     bool done = false; 

     while (!done) 
     { 
      done = true; 

      try 
      { 
       FileStream fileStream = null; 
       fileStream = File.Open(path, File.Exists(path) ? FileMode.Append : FileMode.OpenOrCreate); 

       using (StreamWriter fs = new StreamWriter(fileStream)) 
       { 
        fs.WriteLine(fileStream.Length == 0 ? "Text A" : "Text B"); 
       }; 
       fileStream.Close(); 
      } 
      catch (IOException) 
      { 
       done = false; 

      } 

     } 
+0

Это работает отлично! Tnx много !! – Totallama

0

Вы могли бы попробовать что-то вроде этого:

while (!done) 
    { 
     done = true; 

     try 
     { 
      FileStream fileStream; 
      if (File.Exists(path)) 
      { 
       fileStream = File.Open(path, FileMode.Append); 
      } 
      else 
      { 
       fileStream = File.Open(path, FileMode.OpenOrCreate); 
      } 

      if (fileStream.Length == 0) 
      { 
       //write textA 
      } 
      else 
      { 
       //write textB 
      } 
      fileStream.Close(); 

     } 
     catch (IOException ex) 
     { 
      done = false; 

     } 
    } 
+0

Хорошо, но что я должен поставить вместо '// write textA'? – Totallama

0

Ты почти там! Волшебное слово AppendText(string)

var path = @"C:\MY FOLDER\data.txt"; 

//Create the file if it doesn't exist 
if (!File.Exists(path)) 
{ 
    using (var sw = File.CreateText(path)) 
    { 
     sw.WriteLine("Hello, I'm a new file!!"); 

     // You don't need this as the using statement will close automatically, but it does improve readability 
     sw.Close(); 
    } 
} 

using (var sw = File.AppendText(path)) 
{ 
    for (int i = 0; i < 10; i++) 
    { 
     sw.WriteLine(string.Format("Line Number: {0}", i)); 
    } 
} 

Вам не нужно использовать sw.Close(); в сочетании с using(StreamWriter){} блока, поток будет закрыт автоматически, но это улучшить читаемость трогании.

Кроме того, когда StreamWriter закрыт, он автоматически будет Dispose() в то же время (см. Фрагмент кода ниже), поэтому вызов Dispose() не нужен.

public override void Close() 
{ 
    this.Dispose(true); 
    GC.SuppressFinalize(this); 
} 
+0

Но мне нужен цикл while, чтобы быть там, как есть, это очень важно. И мне нужно проверить, является ли файл ПУСТОЙ! если он был просто создан, потому что файл может быть пустым позже по разным причинам. – Totallama

+0

Ах-ха я неправильно понял! Затем вы можете проверить, есть ли '' (новая FileInfo (filename) .Length == 0) {...} '' вместо этого. Длина 0 означает, что файл пуст. – Neville

0

Существует гораздо более простой способ делать вещи (как заметил Equalsk), с Файл класса.

File.AppendAllText(String, String) documentation

var path = @"C:\MY FOLDER\data.txt";   
var textA = "textA";  
var textB = "textB"; 

// Check if file exists 
if (File.Exists(path)) 
{ 
    // Check if file is empty or not 
    if (new FileInfo(path).Length == 0) 
    { 
     // If empty, write: 
     File.AppendAllText(path, textA + Environment.NewLine); 
    } 
    else 
    { 
     // I not empty, write (appends text): 
     File.AppendAllText(path, textB + Environment.NewLine); 
    } 
} 
else 
{ 
    // If file not exist, create it and write 
    File.AppendAllText(path, textA + Environment.NewLine); 
}