Datei erstellen, wenn die Datei nicht vorhanden ist

76

Ich muss meinen Code lesen lassen, wenn die Datei nicht vorhanden ist. Im Moment liest es, ob es existiert, erstellen und anhängen. Hier ist der Code:

if (File.Exists(path))
{
    using (StreamWriter sw = File.CreateText(path))
    {

Würde ich das tun?

if (! File.Exists(path))
{
    using (StreamWriter sw = File.CreateText(path))
    {

Bearbeiten:

string path = txtFilePath.Text;

if (!File.Exists(path))
{
    using (StreamWriter sw = File.CreateText(path))
    {
        foreach (var line in employeeList.Items)
        {
            sw.WriteLine(((Employee)line).FirstName);
            sw.WriteLine(((Employee)line).LastName);
            sw.WriteLine(((Employee)line).JobTitle);
        }
    }
}
else
{
    StreamWriter sw = File.AppendText(path);

    foreach (var line in employeeList.Items)
    {
        sw.WriteLine(((Employee)line).FirstName);
        sw.WriteLine(((Employee)line).LastName);
        sw.WriteLine(((Employee)line).JobTitle);
    }
    sw.Close();
}

}}

Shan
quelle
1
File.AppendAllText - dies macht genau das, was Sie in einer einzigen Codezeile benötigen.
Shadow Wizard ist Ear For You
@ShadowWizard Da dies mit Hausaufgaben markiert ist, kann OP tatsächlich angewiesen werden, die bedingte Logik anzuzeigen.
Yuck
5
@ Yuck - Hausaufgaben, um das Rad neu zu erfinden? Yuck! ;)
Schatten-Assistent ist Ohr für Sie

Antworten:

113

Sie können einfach anrufen

using (StreamWriter w = File.AppendText("log.txt"))

Die Datei wird erstellt, wenn sie nicht vorhanden ist, und die Datei zum Anhängen geöffnet.

Bearbeiten:

Dies ist ausreichend:

string path = txtFilePath.Text;               
using(StreamWriter sw = File.AppendText(path))
{
  foreach (var line in employeeList.Items)                 
  {                    
    Employee e = (Employee)line; // unbox once
    sw.WriteLine(e.FirstName);                     
    sw.WriteLine(e.LastName);                     
    sw.WriteLine(e.JobTitle); 
  }                
}     

Aber wenn Sie darauf bestehen, zuerst zu überprüfen, können Sie so etwas tun, aber ich verstehe den Punkt nicht.

string path = txtFilePath.Text;               


using (StreamWriter sw = (File.Exists(path)) ? File.AppendText(path) : File.CreateText(path))                 
{                      
    foreach (var line in employeeList.Items)                     
    {                         
      sw.WriteLine(((Employee)line).FirstName);                         
      sw.WriteLine(((Employee)line).LastName);                         
      sw.WriteLine(((Employee)line).JobTitle);                     
    }                  
} 

Eine Sache, die Sie mit Ihrem Code hervorheben sollten, ist, dass Sie viel unnötiges Unboxing durchführen. Wenn Sie eine einfache (nicht generische) Sammlung wie verwenden müssen ArrayList, entpacken Sie das Objekt einmal und verwenden Sie die Referenz.

Ich bevorzuge jedoch die Verwendung List<>für meine Sammlungen:

public class EmployeeList : List<Employee>
Chris Gessler
quelle
18

oder:

using FileStream fileStream = File.Open(path, FileMode.Append);
using StreamWriter file = new StreamWriter(fileStream);
// ...
Mitja Bonca
quelle
1
In diesem Fall erhalten Sie eine IOException, da fileStream die Datei immer noch sperrt, wenn der Stream Writer darauf schreiben möchte. Übergeben Sie stattdessen den fileStream als Argument an den StreamWriter-Konstruktor.
gesalzen
6

Ja, Sie müssen negieren, File.Exists(path)wenn Sie überprüfen möchten, ob die Datei nicht vorhanden ist.

Jakub Konecki
quelle
-1 Das Überprüfen der Dateiexistenz vor dem Öffnen der Datei ist ein falsches Muster. Dies führt zu Rennbedingungen. Siehe die anderen Antworten und meinen Kommentar zu einer anderen Frage .
ComFreek
0

Zum Beispiel

    string rootPath = Path.GetPathRoot(Environment.GetFolderPath(Environment.SpecialFolder.System));
        rootPath += "MTN";
        if (!(File.Exists(rootPath)))
        {
            File.CreateText(rootPath);
        }
Metin Atalay
quelle
-1 Das Überprüfen der Dateiexistenz vor dem Öffnen der Datei ist ein falsches Muster. Dies führt zu Rennbedingungen. Siehe die anderen Antworten und meinen Kommentar zu einer anderen Frage .
ComFreek
Mein Muster wie enthält in linq. Ich meine es ist normal. Manchmal müssen Dateien autorisiert werden. Das Öffnen der Datei sollte die zweite Lösung anstelle unserer Antwort sein.
Metin Atalay
@MetinAtalay Es tut mir leid, ich verstehe Ihren Kommentar nicht vollständig. Ich mache mir Sorgen, dass die Datei, wenn sie extern if (!(File.Exists(...))), aber vorher erstellt wird File.CreateText(...), überschrieben wird.
ComFreek
0
private List<Url> AddURLToFile(Urls urls, Url url)
{
    string filePath = @"D:\test\file.json";
    urls.UrlList.Add(url);

    //if (!System.IO.File.Exists(filePath))
    //    using (System.IO.File.Delete(filePath));

    System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(urls.UrlList));

    //using (StreamWriter sw = (System.IO.File.Exists(filePath)) ? System.IO.File.AppendText(filePath) : System.IO.File.CreateText(filePath))
    //{
    //    sw.WriteLine(JsonConvert.SerializeObject(urls.UrlList));
    //}
    return urls.UrlList;
}

private List<Url> ReadURLToFile()
{
    //  string filePath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), @"App_Data\file.json");
    string filePath = @"D:\test\file.json";

    List<Url> result = new List<Url>(); ;
    if (!System.IO.File.Exists(filePath))
        using (System.IO.File.CreateText(filePath)) ;



    using (StreamReader file = new StreamReader(filePath))
    {
        result = JsonConvert.DeserializeObject<List<Url>>(file.ReadToEnd());
        file.Close();
    }
    if (result == null)
        result = new List<Url>();

    return result;

}
Deph
quelle
Willkommen bei SO. Bitte geben Sie weitere Informationen an, warum dieser Code die Frage beantworten könnte. Stellen Sie außerdem ein minimal reproduzierbares Beispiel bereit .
Mathias
0

Das funktioniert auch bei mir

string path = TextFile + ".txt";

if (!File.Exists(HttpContext.Current.Server.MapPath(path)))
{
    File.Create(HttpContext.Current.Server.MapPath(path)).Close();
}
using (StreamWriter w = File.AppendText(HttpContext.Current.Server.MapPath(path)))
{
    w.WriteLine("{0}", "Hello World");
    w.Flush();
    w.Close();
}
Eastop
quelle
0

Dies ermöglicht das Anhängen an eine Datei mit StreamWriter

 using (StreamWriter stream = new StreamWriter("YourFilePath", true)) {...}

Dies ist der Standardmodus, nicht an Datei anhängen und eine neue Datei erstellen.

using (StreamWriter stream = new StreamWriter("YourFilePath", false)){...}
                           or
using (StreamWriter stream = new StreamWriter("YourFilePath")){...}

Wie auch immer, wenn Sie überprüfen möchten, ob die Datei vorhanden ist, und dann andere Dinge tun möchten, können Sie verwenden

using (StreamWriter sw = (File.Exists(path)) ? File.AppendText(path) : File.CreateText(path))
            {...}
Abdul Hadee
quelle