File.Move() kann nicht auf Datei zugreifen

tecla

Erfahrenes Mitglied
Hallo alle zusammen

Ich habe einen merkwürdigen Fehler, der nur sporadisch auftritt aber sehr ärgerlich ist.

Ich versuche eine Datei mit

Code:
File.Move(oldpath, newpath)

zu verschieben. Die Datei ist weder geöffnet, noch schreibgeschützt und auch nicht schon vorhanden am neuen Speiecherort. Trotzdem erhalte ich auf manchen Rechnern die Meldung:

Der Prozess kann nicht auf die Datei zugreifen, da sie bereits von einem anderen Prozess verwendet wird.

Ich wüsste nicht von wem. Höchstens von mir selber. Weiter vorne im Programm öffne ich den Dateibrowser mit dem OpenFileDialog und hole mir so den alten Dateipfad. Kann das sein, dass mir das nun den Zugriff blockiert und wenn ja, wie kann ich das File "loslassen"?

Bin froh um jede Hilfe

liebe grüsse, tecla
 
Vielleicht hast du noch das Eigenschaften-Fenster der Datei geöffnet, das du per Kontextmenü im Explorer aufgerufen hast? Anders kann ich es mir nicht erklären. Wenn du aber den Namen schon kennst und nur den Pfad brauchst, kannst du auch die FolderBrowserDialog-Klasse verwenden, vielleicht hilft das.
 
hmmm...

Ich hab kein Kontextmenü, nicht mal den Windows-Explorer offen. Nix...

Ich hole mit dem FileOpenDialog den Dateipfad und schreibe ihne in eine Textbox. Diese hat die Eigenschaft ReadOnly. Daran kanns aber nicht liegen, denn manchmal geht das File.Move() ja ohne Probleme.
Auf Knopfdruck wird die Datei dann mit File.Move umbenamst und an den richtigen Ort abgelegt. Mehr mach ich nicht.
 
Zuletzt bearbeitet:
Kannst du den Fehler reproduzieren oder ist das ganze Verhalten sehr sporadisch? Magst du mal Code zeigen? Versuchst du vielleicht Systemdateien zu verschieben/umzubenennen?
 
Den Fehler reprodizieren kann ich nicht, da er auf meinem Entwicklungsrechner nicht auftritt. Ich weiss also nicht genau, in welcher Zeile das Problem liegt.

Es sind jedenfalls ganz normale Worddokumente /pdfs und ähnliches, keine Systemdateien, nix schreibgeschütztes....
Was noch auffällig ist: der Fehler scheint vor allem dann aufzutreten, wenn ich Dateien vom FileServer auswähle.

Kann es vielleicht daran liegen, dass ich einen Stream verwende beim Datei-Browser? Geht das auch ohne?

Hier mein Code:

Im GUI:

Code:
        private void buttonDateiSuchen_Click(object sender, EventArgs e)
        {
            string sDateiPfad = AllgemeineFunktionen.Browse("", "");
            textBoxDateipfad.Text = sDateiPfad;
        }

Code:
        private void buttonSave_Click(object sender, EventArgs e)
        {
             //Code, der nichts mit der Sache zu tun hat
             //Hier wird beispielsweise der neue Dateiname zusammengesetzt....
  

              if (!Directory.Exists(sPfad))
              {
                    Directory.CreateDirectory(sPfad);
              }
              File.Move(textBoxDateipfad.Text, sDBDateipfad);
              Message = "Die Datei wurde in den Aktenordner verschoben.";                   
        }


Die Dateibrowser-Funktion:

Code:
        private static string Browse(string sFilter, string sPath)
        {
            Stream myStream;
            string sPfad = string.Empty;
            OpenFileDialog openFileDialog1 = new OpenFileDialog();
            openFileDialog1.Title = "Datei aussuchen";
            if (sPath == "")
                openFileDialog1.InitialDirectory = "c:\\";
            else
                openFileDialog1.InitialDirectory = sPath;
            if (sFilter != "")
                openFileDialog1.Filter = sFilter + " files (*." + sFilter + ")|*.xls|All files (*.*)|*.*";
            openFileDialog1.FilterIndex = 2;
            openFileDialog1.RestoreDirectory = true;

            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    if ((myStream = openFileDialog1.OpenFile()) != null)
                    {
                        sPfad = openFileDialog1.FileName;
                    }

                }
                catch
                {
                    MessageBox.Show("Die Datei konnte nicht geöffnet werden!\n" +
                        "Vermutlich ist sie schon offen oder durch einen anderen Benutzer gesperrt.");
                }
            }
            return sPfad;
        }
 
Oh, es scheint am Zielordner zu liegen, so ein Vista-Sicherheits-Problem!!

Obwohl mein User Vollzugriff auf den Ordner hat, ist das Häkchen schreibgeschützt gesetzt und lässt sich auch nicht wegklicken...
Vielleicht krieg ichs ja per Code weg.
 
OK, wenn ich überall den Schreibschutz erst aufhebe und keinen Windows-Explorer offen hab, dann gehts:

Code:
                if(!Directory.Exists(sPfad))
                {
                    Directory.CreateDirectory(sPfad);
                }

                //DateiAttribute von altem Ordner 
                string sPfadAlt = textBoxDateiPfad.Text;
                i = sPfadAlt.LastIndexOf("\\");
                sPfadAlt = sPfadAlt.Remove(i + 1);
                DirectoryInfo dirAlt = new DirectoryInfo(sPfadAlt);
                DirectoryInfo dirAltOrg = dirAlt;
                dirAlt.Attributes = FileAttributes.Normal;

                //Schreibschutz von altem File aufheben
                FileInfo fi = new FileInfo(textBoxDateiPfad.Text);
                FileAttributes attribute = FileAttributes.ReadOnly;
                attribute ^= FileAttributes.ReadOnly;
                File.SetAttributes(fi.FullName, attribute);

                //FileAttribute von neuem Ordner ReadOnly aufheben
                DirectoryInfo dirNeu = new DirectoryInfo(sPfad);
                DirectoryInfo dirNeuorg = dirNeu;
                dirNeu.Attributes = FileAttributes.Normal;

                File.Move(textBoxDateiPfad.Text, sDBDateipfad);
                sMessage = "Die Datei wurde in den Aktenordner verschoben.";

                dirNeu.Attributes = dirNeuorg.Attributes;
                dirAlt.Attributes = dirAltOrg.Attributes;

Wieso es nicht hinhaut, wenn der Windows-Explorer offen ist, ist mir nach wie vor ein Rätsel...


Und falls noch jemand elegantere Lösungen hat, habe ich ebenfalls ein grosses, offenes Ohr...
 
Code:
if ((myStream = openFileDialog1.OpenFile()) != null)
                    {
                        sPfad = openFileDialog1.FileName;
                    }
Schließ mal den Stream den du da bekommst.
Sonst ist die Datei wieder in Verwendung/gesperrt.
(Und im Catch am besten die Exception noch mit ausgeben)
 
Danke für die Tipps!!
Den Stream hab ich aber mittlerweile ganz rausgelöscht, dh. der kanns auch nicht sein:

Code:
private static string Browse(string sFilter, string sPath)
        {
            string sPfad = string.Empty;
            OpenFileDialog openFileDialog1 = new OpenFileDialog();
            openFileDialog1.Title = "Datei aussuchen";
            if (sPath == "")
                openFileDialog1.InitialDirectory = "c:\\";
            else
                openFileDialog1.InitialDirectory = sPath;
            if (sFilter != "")
                openFileDialog1.Filter = sFilter + " files (*." + sFilter + ")|*.xls|All files (*.*)|*.*";
            openFileDialog1.FilterIndex = 2;
            openFileDialog1.RestoreDirectory = true;

            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    if (openFileDialog1.OpenFile() != null)
                    {
                        sPfad = openFileDialog1.FileName;
                    }

                }
                catch
                {
                    MessageBox.Show("Die Datei konnte nicht geöffnet werden!\n" +
                        "Vermutlich ist sie schon offen oder durch einen anderen Benutzer gesperrt.");
                }
            }
            return sPfad;
        }

Dann werd ich jetzt mal im catch-Block noch die Fehlermeldung ausgeben, obwohl es ja immer schwerer zum Testen wird, weil das Ding jetzt fast immer läuft....


Beziehungsweise einen try-catch-Block ums File.Move() legen, es kommt ja nicht meine Fehlermeldung vom Dateibrowser, sondern eine unbehandelte Ausnahme mit der Meldung:

"Der Prozess kann nicht auf die Datei zugreifen, da sie bereits von einem anderen Prozess verwendet wird. "

Da kann also nur vom File.Move() stammen...
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück