File.Move() kann nicht auf Datei zugreifen

Ich würde
Code:
try
{
...
}
catch(Exception ex)
{
  MessageBox.Show(this, "Fehleraufgetretten" ex.Message, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
ungefähr das vorschlagen.
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 :mad:!

Es ist auf jedenfall definitiv nicht der DateiBrowser, der den Fehler produziert, sondern das File.Move() in folgendem Code-Abschnitt:
Code:
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
 
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.
 
Hallo Shakie

Erstmal Danke für den Tipp mit dem ProzessExplorer!
Tja, es IST mein eigener Prozess Sobald ich mit dem OpenFileDialog drauf browse und auf öffnen klicke, hat mein Prozess die Datei im festen Griff und lässt sie nicht mehr los! So ein Ärger. Hast du ne Idee, wie ich meinem Prozess befehlen kann, die Datei wieder freizugeben?

Liebe Grüsse
 
ich hab jetzt mal meinem FileOpenDialog ein Dispose() befohlen. Das scheint zu nützen:

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;
                        openFileDialog1.Dispose();
                    }

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

Momentan klappts damit, herzlichen Dank für eure Hilfe
 
Hi.

Versuch mal beim Öffnen vom Dialog using zu verwenden, und das selbe dann nochmal bei der Datei. Dadurch werden die Resourcen automatisch freigegeben,.. so sparst du dir das Aufrufen von Dispose.

C#:
private static string Browse(string sFilter, string sPath)
{
    string sPfad = string.Empty;
    using (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
			{
				using (Stream strm = openFileDialog1.OpenFile())
				{
					if (strm != 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;
}


lg,..
 
Das bringts Supi, jetzt scheints einwandfrei zu klappen!
Herzlichen Dank, war das jetzt eine Zangengeburt!
 
Zurück