tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
Like Tree2Danke
ERLEDIGT
JA
ANTWORTEN
22
ZUGRIFFE
2101
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von tecla
    tecla tecla ist offline Mitglied Gold
    Registriert seit
    Jul 2007
    Beiträge
    163
    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
     

  2. #2
    Avatar von Vereth
    Vereth Vereth ist offline Mitglied Brokat
    Registriert seit
    Nov 2009
    Ort
    Dortmund
    Beiträge
    372
    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.

  3. #3
    Avatar von Shakie
    Shakie Shakie ist offline Mitglied Diamant
    Registriert seit
    May 2004
    Ort
    Europa
    Beiträge
    2.048
    Der OpenFileDialog blockiert da nichts. Muss woanders dran liegen.
     
    hihi = -h²

  4. #4
    Avatar von tecla
    tecla tecla ist offline Mitglied Gold
    Registriert seit
    Jul 2007
    Beiträge
    163
    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
     

  5. #5
    Avatar von Shakie
    Shakie Shakie ist offline Mitglied Diamant
    Registriert seit
    May 2004
    Ort
    Europa
    Beiträge
    2.048
    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²

  6. #6
    Avatar von tecla
    tecla tecla ist offline Mitglied Gold
    Registriert seit
    Jul 2007
    Beiträge
    163
    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;
            }
     

  7. #7
    Avatar von tecla
    tecla tecla ist offline Mitglied Gold
    Registriert seit
    Jul 2007
    Beiträge
    163
    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.
     

  8. #8
    Avatar von tecla
    tecla tecla ist offline Mitglied Gold
    Registriert seit
    Jul 2007
    Beiträge
    163
    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...
     

  9. #9
    Avatar von Spyke
    Spyke Spyke ist offline Capoeirista
    Registriert seit
    Oct 2002
    Beiträge
    931
    Code :
    1
    2
    3
    4
    
    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)
     
    www.iv-interactive.de - Projektewebsite
    WikiParser - aktuelles Projekt

  10. #10
    Avatar von tecla
    tecla tecla ist offline Mitglied Gold
    Registriert seit
    Jul 2007
    Beiträge
    163
    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...
     

  11. #11
    Avatar von Spyke
    Spyke Spyke ist offline Capoeirista
    Registriert seit
    Oct 2002
    Beiträge
    931
    Ich würde
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    
    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.
     
    www.iv-interactive.de - Projektewebsite
    WikiParser - aktuelles Projekt

  12. #12
    Avatar von tecla
    tecla tecla ist offline Mitglied Gold
    Registriert seit
    Jul 2007
    Beiträge
    163
    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
     

  13. #13
    Avatar von Shakie
    Shakie Shakie ist offline Mitglied Diamant
    Registriert seit
    May 2004
    Ort
    Europa
    Beiträge
    2.048
    Zitat Zitat von tecla Beitrag anzeigen
    ... ganz normales Worddokument...
    Bist du sicher, dass Word geschlossen ist/nicht auf die Datei zugreift? Hast du mal im Taskmanager geschaut, ob da kein Word-Prozess mehr offen ist?
     
    hihi = -h²

  14. #14
    Avatar von tecla
    tecla tecla ist offline Mitglied Gold
    Registriert seit
    Jul 2007
    Beiträge
    163
    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
     

  15. #15
    Avatar von Shakie
    Shakie Shakie ist offline Mitglied Diamant
    Registriert seit
    May 2004
    Ort
    Europa
    Beiträge
    2.048
    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

  1. Kann nicht auf Datei zugreifen
    Von Didistreu im Forum .NET Café
    Antworten: 2
    Letzter Beitrag: 07.02.10, 17:44
  2. Der Prozess kann nicht auf die Datei zugreifen
    Von PH234X im Forum .NET Windows Forms
    Antworten: 4
    Letzter Beitrag: 15.09.09, 09:31
  3. move file
    Von al-Maghribi im Forum PHP
    Antworten: 1
    Letzter Beitrag: 13.05.08, 22:58
  4. Datei: lesen eines Files - Prozess kann nicht zugreifen
    Von sinamine im Forum .NET Windows Forms
    Antworten: 2
    Letzter Beitrag: 25.04.08, 14:42
  5. Antworten: 2
    Letzter Beitrag: 05.10.06, 11:26