Datei im erstellten Ordner erzeugen

K

KotNaschor

Hallo,

ich habe mit
Code:
Directory.CreateDirectory("Options");
einen Ordner erzeugt, und habe mit
Code:
if (!File.Exists("Options/options.save"))
                File.Create("Options/options.save");
eine Datei in diesem ordner erstellt (falls noch keine drin war).

und jetzt das problem!
wenn ich danach auf diese datei zugreifen will, nähmlich so:
Code:
Options_arr = File.ReadAllLines("Options/options.save");
sagt er mir das, dass nicht geht weil ein anderer Prozess grad auf die Datei zugreift.
Das passiert aber nur wenn er die Datei gerade auch erstellt hat, also muss es ja denke ich mal an File.Create liegen oda?
Wie kann man das besser machen?
 
Create öffnet einen Stream zur neuen Datei (macht Sinn, üblicherweise schreibt man danach was in die Datei). Den musst du schließen.

Code:
if (!File.Exists("Options/options.save"))
                File.Create("Options/options.save").Close();
 
Hi.

File.Create erstellt eine Datei, und liefert dir einen FileStream auf die Datei zurück. Sprich: dein Aufruf öffnet die Datei auch.

Also entweder schließt du deine Datei gleich wieder...

C#:
if (!File.Exists("Options/options.save"))
    File.Create("Options/options.save").Close();

..oder du baust dein Konstrukt so um, dass wenn die Datei nicht existiert, auch nichts gelesen wird. ;)

lg..
 
Hi, dass mit dem .Close() kannte ich bisher noch gar nicht.
Ich habe mir da was zusammengeschrieben, und zwar damit:
Code:
// In AllFilesServer sind strings mit Datei-Pfaden.
foreach (string files in AllFilesServer)
{
    if (!File.Exists(files))
    {    //start = DateTime.
        start = DateTime.Now;
        //Endlosschleife.
        while (true)
        {    //pruefzeit = DateTime.
            pruefzeit = DateTime.Now;
            try
            {    //Hier wird überprüft, ob der Zugriff auf die Datei schon 10 Sekunden oder länger dauert.
                if ((pruefzeit.Ticks - start.Ticks) >= (10 * TimeSpan.TicksPerSecond))
                {   //Wenn ja wird die Schleife abgebrochen. (LogEintrag ist eine Liste, die Logeinträge verwaltet. Hier wird z.B. die Gehlermeldung "Zeitüberschreitung beim Versuch die Datei zu kopieren.")
                    LogEintraege.Add(new LogEintrag(DateTime.Now, 0008));
                    break;
                }
                // Hier wird die Datei Kopiert. Wenn die Datei den Zugriff verweigert, wird das catch ausgelöst.
                File.Copy(AllFilesLocal[counter].ToString(), files, true);
                // Log wird geschrieben.
                LogEintraege.Add(new LogEintrag(DateTime.Now, 0010, files));
                //Die while-schleife wird beendet.
                break;
            }
            //einmaliges dient dazu das log über das misslingen des Kopierens nur ein mal zu schreiben.
            catch { if (einmaligesLog == true) { LogEintraege.Add(new LogEintrag(DateTime.Now, 0007)); einmaligesLog = false; } }
        }
    }
}

Also der Code versucht eine Datei zu kopieren. Wenn diese sich nicht kopieren lässt, dann wird geschaut, ob seit beginn des kopier-veruchs 10 sec vergangen sind. Wenn ja, dann wird abgebrochen. ansonsten läuft die schleife als endlosschleife durch und versucht jedesmal die datei zu kopieren.
 

Neue Beiträge

Zurück