Wird eine using-Klausel diesen Stream schließen?

Habe ich anscheinend arbeitete mich in eine schlechte Codierung Gewohnheit. Hier ist ein Beispiel für den code, ich habe geschrieben:

using(StreamReader sr = new StreamReader(File.Open("somefile.txt", FileMode.Open)))
{
    //read file
}
File.Move("somefile.txt", "somefile.bak"); //can't move, get exception that I the file is open

Dachte ich, dass da die using - Klausel explizit genannt Close() und Dispose() auf die StreamReader dass die FileStream wäre Sie geschlossen.

Nur so konnte ich das problem beheben, die ich hatte wurde durch die änderung der oben block:

using(FileStream fs = File.Open("somefile.txt", FileMode.Open))
{
  using(StreamReader sr = new StreamReader(fs))
  {
    //read file
  }
}

File.Move("somefile.txt", "somefile.bak"); //can move file with no errors

Sollte die Schließung der StreamReader durch die Entsorgung in den ersten block auch in der Nähe der zugrunde liegenden FileStream? Oder, war ich Irre?

Bearbeiten

Entschied ich mich zum posten der eigentlichen problematischen code-block, um zu sehen, ob wir bekommen können Sie unten auf dieser. Ich bin einfach nur neugierig jetzt.

Dachte ich, ich hätte ein problem in der using - Klausel, also habe ich alles ausgebaut und es ist immer noch nicht kopieren können, zu jeder Zeit. Ich erstelle die Datei, in der diese Methode aufgerufen wird, so dass ich denke nichts anderes hat einen Griff öffnen auf die Datei. Ich habe auch überprüft, ob die Zeichenfolgen zurückgegeben, die von der Path.Combine Anrufe korrekt sind.

private static void GenerateFiles(List<Credit> credits)
{
    Account i;
    string creditFile = Path.Combine(Settings.CreditLocalPath, DateTime.Now.ToString("MMddyy-hhmmss") + ".credits");

    StreamWriter creditsFile = new StreamWriter(File.Open(creditFile, FileMode.Create));

    creditsFile.WriteLine("code\inc");

    foreach (Credit c in credits)
    {
        if (DataAccessLayer.AccountExists(i))
        {
            string tpsAuth = DataAccessLayer.GetAuthCode(i.Pin);
            creditsFile.WriteLine(String.Format("{0}{1}\t{2:0.00}", i.AuthCode, i.Pin, c.CreditAmount));
        }
        else
        {
            c.Error = true;
            c.ErrorMessage = "NO ACCOUNT";
        }

        DataAccessLayer.AddCredit(c);

    }

    creditsFile.Close();
    creditsFile.Dispose();

    string dest =  Path.Combine(Settings.CreditArchivePath, Path.GetFileName(creditFile));
    File.Move(creditFile,dest);
    //File.Delete(errorFile);
}
Kommentar zu dem Problem
Ist es möglich eine andere Anwendung hat die Datei geöffnet und gesperrt? Sie können prüfen wollen, wie gut. Kommentarautor: Daniel
DateTime.Nun.ToString("Mmttjj-hhmmss"), Wie viele Dateien Sie erstellen pro Sekunde? Kommentarautor: Dave
@Dave, einen Tag und. Diese Funktion wird nur aufgerufen, einmal am Tag. Kommentarautor: scottm
Überprüfen Sie für den Anti-Virenscanner, Indizierung, Server, usw. Kommentarautor: Dominic Cronin

InformationsquelleAutor der Frage scottm | 2009-04-01

Schreibe einen Kommentar