Frage an c#, streamwriter – Datei erstellen, wenn Datei nicht vorhanden ist

57

Ich muss meinen Code zum Lesen bringen, wenn die Datei nicht existiert. Im Moment wird gelesen, ob es existiert, und erstellt und angehängt. Hier ist der Code:

<code>if (File.Exists(path))
{
    using (StreamWriter sw = File.CreateText(path))
    {
</code>

Würde ich das machen

<code>if (! File.Exists(path))
{
    using (StreamWriter sw = File.CreateText(path))
    {
</code>

Bearbeiten:

<code>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();
}
</code>

}

@ShadowWizard Da dies als Hausaufgabe gekennzeichnet ist, kann OP tatsächlich angewiesen werden, die bedingte Logik anzuzeigen. Yuck
@Yuck - Hausaufgaben, um das Rad neu zu erfinden? Yuck! ;) Shadow Wizard
File.AppendAllText - Das macht genau das, was Sie in einer einzigen Codezeile brauchen. Shadow Wizard

Deine Antwort

5   die antwort
86

Sie können einfach anrufen

<code>using (StreamWriter w = File.AppendText("log.txt"))
</code>

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

Bearbeiten:

Das reicht aus:

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

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

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

Eine Sache, auf die Sie in Ihrem Code hinweisen müssen, ist, dass Sie eine Menge unnötiges Unboxing machen. Wenn Sie eine einfache (nicht generische) Sammlung wie verwenden müssenArrayListEntpacken Sie dann das Objekt einmal und verwenden Sie den Verweis.

Ich bevorzuge jedoch zu verwendenList<> für meine Sammlungen:

<code>public class EmployeeList : List<Employee>
</code>
15

<code>using(var fileStream = File.Open(path, FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
    using (StreamWriter sw = new StreamWriter(path, true))
    {
        //...
    }
}
</code>
In diesem Fall würden Sie eine IOException erhalten, da fileStream die Datei immer noch sperrt, wenn Stream Writer darauf schreiben möchte. Übergeben Sie stattdessen den fileStream als Argument an den StreamWriter-Konstruktor. salted
7

File.Exists(path) wenn Sie überprüfen möchten, ob die Dateinicht existieren.

11

sondern File.Open erledigt sie für Sie. Versuchen:

<code>using (StreamWriter sw = new StreamWriter(File.Open(path, System.IO.FileMode.Append))) 
{
</code>

Ref:http://msdn.microsoft.com/en-us/library/system.io.filemode.aspx

1

Zum Beispiel

<code>    string rootPath = Path.GetPathRoot(Environment.GetFolderPath(Environment.SpecialFolder.System));
        rootPath += "MTN";
        if (!(File.Exists(rootPath)))
        {
            File.CreateText(rootPath);
        }
</code>

Verwandte Fragen