-
Hallo alle zusammen
Ich habe einen merkwürdigen Fehler, der nur sporadisch auftritt aber sehr ärgerlich ist.
Ich versuche eine Datei mit
Code :1
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.
Vielen Dank für die Nutzung des Bewerten- und Danke-Buttons
Wenn man sieht, dass man einen anderen glücklich gemacht hat, ist die Welt um zwei glückliche Menschen reicher.
-
Der OpenFileDialog blockiert da nichts. Muss woanders dran liegen.
hihi = -h²
-
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.Geändert von tecla (15.01.10 um 17:29 Uhr) Grund: genauer ist besser
-
Kannst du den Fehler reproduzieren oder ist das ganze Verhalten sehr sporadisch? Magst du mal Code zeigen? Versuchst du vielleicht Systemdateien zu verschieben/umzubenennen?
hihi = -h²
-
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 :1 2 3 4 5
private void buttonDateiSuchen_Click(object sender, EventArgs e) { string sDateiPfad = AllgemeineFunktionen.Browse("", ""); textBoxDateipfad.Text = sDateiPfad; }
Code :1 2 3 4 5 6 7 8 9 10 11 12 13
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 :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
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 :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
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...
-
Schließ mal den Stream den du da bekommst.Code :
1 2 3 4
if ((myStream = openFileDialog1.OpenFile()) != null) { sPfad = openFileDialog1.FileName; }
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 :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
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...Geändert von tecla (18.01.10 um 19:01 Uhr) Grund: gründlicher nachgedacht...
-
Ich würde
ungefähr das vorschlagen.Code :1 2 3 4 5 6 7 8
try { ... } catch(Exception ex) { MessageBox.Show(this, "Fehleraufgetretten" ex.Message, MessageBoxButtons.OK, MessageBoxIcon.Error); }
Muss ja nicht unbedingt ein Fehler auftretten weil die Datei gerade verwendet wird, sie könnte ja auch mittlerweile gelöscht sein, oder irgendwas anderes.
-
Hallo zusammen
Über längere Zeit hatte ich jetzt Ruhe und keine Fehlermeldung mehr - heute ist er wieder da
!
Es ist auf jedenfall definitiv nicht der DateiBrowser, der den Fehler produziert, sondern das File.Move() in folgendem Code-Abschnitt:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
try { 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; } catch (Exception ex) { MessageBox.Show(ex.ToString()); }
Die Fehlermeldung lautet:
System.IO:IOException: Der Prozess kann nicht auf die Datei zugreifen, da sie bereits von einem anderen Prozess verwendet wird.
bei System.IO._Error.WinIOError(Int32 errorCode, String maybeFullPath)
bei System.IO._Error.WinIOError()
bei System.IO.File.Move(String sourceFileName, String destFileName)
bei ProDOK.Akteneingang. buttonSpeichern_Click(Object sender, EventArgs e)
Ich bin mir ganz sicher, dass nur mein eigenes Programm dieser Prozess sein kann, da ich nicht einmal den Explorer offen hab. nix. Ich vermute immer noch, dass die Suche mit dem OpenFileDialog vorher die Datei irgendwie immer noch im Griff hat.
Es handelt sich ganz sicher um keine Systemdatei oder ähnliches, sondern um ein ganz normales Worddokument. Wenn mir jemand helfen kann, dass mein Programm die Datei wieder loslässt, bin ich sehr, sehr froh!
Liebe Grüsse,
Tecla
-
hihi = -h²
-
Hallo Shakie
Ich bin ganz sicher und habs soeben nochmals überprüft:
Das Word ist zu, im Taskmanager hats ebenfalls keinen WINWORD - Prozess, der Explorer ist ebenfalls zu...
Es ist zum verzweifeln!
Grüsse, Tecla
-
Kennst du "Process Explorer" von Sysinternals? Siehe hier.
Damit kannst du dir anzeigen lassen, welcher Prozess auf welche Datei zugreift und umgekehrt nach Prozessen suchen, die auf eine bestimmte Datei zugreifen.
Lade dir das Programm herunter und klicke auf folgende Menüpunkte:
View --> Show Lower Pane (Strg+L)
Jetzt werden alle Dateizugriffe pro Prozess angezeigt
Find --> Find Handle or Dll (Strg+F)
Damit kannst du herausfinden, welcher Prozess auf deine Worddatei zugreift. Einfach als Suchtext den Namen der Datei eingeben.
Eine leicht veraltete Beschreibung (Menüpunkte heißen anders) dazu findest du auch hier hier.
Vielleicht wirst du dann schlauer. Ich bezweifel sehr stark, dass es an der OpenFileDialog-Klasse liegt.hihi = -h²
Ähnliche Themen
-
Kann nicht auf Datei zugreifen
Von Didistreu im Forum .NET CaféAntworten: 2Letzter Beitrag: 07.02.10, 17:44 -
Der Prozess kann nicht auf die Datei zugreifen
Von PH234X im Forum .NET Windows FormsAntworten: 4Letzter Beitrag: 15.09.09, 09:31 -
move file
Von al-Maghribi im Forum PHPAntworten: 1Letzter Beitrag: 13.05.08, 22:58 -
Datei: lesen eines Files - Prozess kann nicht zugreifen
Von sinamine im Forum .NET Windows FormsAntworten: 2Letzter Beitrag: 25.04.08, 14:42 -
Prozess kann nicht auf Datei zugreifen nach XML-Generierung
Von Paranoia im Forum JavaAntworten: 2Letzter Beitrag: 05.10.06, 11:26



2Danke

Zitieren
Login





