Entwickler-Ecke

IO, XML und Registry - Problem beim Datei Zugriff, System.UnauthorizedAccessExcept.


1Csharpuser - Mo 11.06.12 02:11
Titel: Problem beim Datei Zugriff, System.UnauthorizedAccessExcept.
Guten Abend,

Ich bin recht unerfahren im Umgang mit Programmiersprachen und arbeite mich erst seit kurzem, mit Blick auf ein nahendes Mathe Studium, in die Materie ein.
Folgendes Problem kriege ich bei C# nicht in den Griff:

Es geht um ein recht triviales Programm, dass den Inhalt einer Textdatei auslesen soll;




C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
private void button1_Click(object sender, EventArgs e)
        {
            string Quellpfad = textBox1.Text;
            string zielpfad = textBox2.Text;
            string dateiname = textBox3.Text;

            string bezugsordner = Path.Combine(bezugspfad, dateiname);
            string zielordner = Path.Combine(zielpfad, dateiname);

            

                if (!Directory.Exists(zielpfad))
                {
                    Directory.CreateDirectory(zielpfad);
                }

                File.Copy(bezugspfad, zielordner, true);
           
        }


Sobald der Compiler die Methode File.Copy implementiert, wird folgende Fehlermeldung angezeigt:

"Eine nicht behandelte Ausnahme des Typs "System.UnauthorizedAccessException" ist in mscorlib.dll aufgetreten.

Zusätzliche Informationen: Der Zugriff auf den Pfad "C:\Users\Allen\testordner" wurde verweigert."

Dabei ist es unerheblich, auf welchen Ordner zugegriffen werden soll.

Meine Frage ist nun, wie kann man dem Abhilfe schaffen ?
Die Einbindung eines Anwendungsmanifests, welches dem Programm Administratorenrechte zugesteht, führt leider ebenfalls zu selbigen Fehler.

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
Moderiert von user profile iconChristian S.: Topic aus Basistechnologien verschoben am Mo 11.06.2012 um 07:49


Palladin007 - Mo 11.06.12 16:16

Zeig doch mal die Pfad-Daten oder der Einfachheit halber ein Screenshot der Oberfläche, in der du die Daten eingibst.
Einfach einen Test-Pfad, Test-Name, etc. bei dem es definitiv NICHT funktioniert.

Das Einzige, was mir da bei dem Code noch auffällt, ist, dass du erlaubst, eine bereits vorhandene, gleichnamige Datei zu überschreiben. Da ich nicht weiß, welche Daten du angibst, und wie das Ziel genau aussieht, werfe ich einfach mal die Möglichkeit in den Raum, dass irgendein Programm (oder eventuell dein selbst geschriebenes Programm) die zu überschreibende Datei verwendet und Veränderungen blockiert.


Christian S. - Mo 11.06.12 16:19

Hallo!

Du verwendest die Variable "bezugspfad", die wird in Deiner Methode aber nirgendwo deklariert oder zugewiesen. Ist das nur ein Fehler beim Kopieren des Quelltextes ins Forum oder ist das auch bei Dir im Programm so?

Und wenn ich das richtig deute, enthielte die, würde sie denn zugewiesen, einen Ordner und keinen Pfad zu einer Datei, der steckt widersprüchlicherweise in "bezugsordner" ;-)

Viele Grüße,
Christian


1Csharpuser - Mo 11.06.12 21:59

user profile iconPalladin007 hat folgendes geschrieben Zum zitierten Posting springen:
Zeig doch mal die Pfad-Daten oder der Einfachheit halber ein Screenshot der Oberfläche, in der du die Daten eingibst.
Einfach einen Test-Pfad, Test-Name, etc. bei dem es definitiv NICHT funktioniert.

Das Einzige, was mir da bei dem Code noch auffällt, ist, dass du erlaubst, eine bereits vorhandene, gleichnamige Datei zu überschreiben. Da ich nicht weiß, welche Daten du angibst, und wie das Ziel genau aussieht, werfe ich einfach mal die Möglichkeit in den Raum, dass irgendein Programm (oder eventuell dein selbst geschriebenes Programm) die zu überschreibende Datei verwendet und Veränderungen blockiert.



Ich hab mal ein Screenshot von der Benutzeroberfläche angefertigt. Die Datei "Test.txt" befindet sich im Ordner "Testordner" (also der Bezugspfad), der sich wiederum, zusammen mit den "Zielordner" (also der Zielpfad) in "C:\Users\Allen" befindet. "C:\Users\Allen" ist nicht schreibgeschützt.
Selbiges Problem tritt im Übrigen auch auf, wenn ich z.B. Textdateien vom Typ txt einfach nur auslesen will (also mit filestream und streamreader):

Wenn ich eine beliebige Textdatei, einfach nur auslesen will und den Text in einem Label ausgeben will, so tritt der Fehler ebenso auf; einzige Ausnahme: Die Textdatei befindet sich im selben Ordner wie das entsprechende Programm, also z.B. C:\Users\Allen\Documents\Visual Studio 2010\Projects\x\bin\Debug



user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:
Hallo!

Du verwendest die Variable "bezugspfad", die wird in Deiner Methode aber nirgendwo deklariert oder zugewiesen. Ist das nur ein Fehler beim Kopieren des Quelltextes ins Forum oder ist das auch bei Dir im Programm so?

Und wenn ich das richtig deute, enthielte die, würde sie denn zugewiesen, einen Ordner und keinen Pfad zu einer Datei, der steckt widersprüchlicherweise in "bezugsordner" ;-)

Viele Grüße,
Christian


Ahhh... stimmt, den "Bezugsordner" wollte ich erst später zu anderen Zwecke verwenden, ich habe Das versehentlich mit reinkopiert. Habe das Programm nochmal getestet, für das Problem ist das jedoch offenbar unerheblich.


Christian S. - Mo 11.06.12 22:18

Das heißt Du übergibst File.Copy auf jeden Fall Dateien und keine Ordner, mit denen es arbeiten soll?


1Csharpuser - Mo 11.06.12 23:30

user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:
Das heißt Du übergibst File.Copy auf jeden Fall Dateien und keine Ordner, mit denen es arbeiten soll?


Daran könnte es liegen, ich übergebe File.Copy ja letztendlich 2 Pfadangaben, die auf eine Datei bzw. den Ort an den die Datei hinkopiert werden soll verweisen müssen.

Ich habe den Code noch mal ein wenig geändert;


C#-Quelltext
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:
private void button1_Click(object sender, EventArgs e)
        {
            string bezugspfad = textBox1.Text;
            string zielpfad = textBox2.Text;
            string dateiname = textBox3.Text;

            
            string zielordner = Path.Combine(zielpfad, dateiname);
            string bezugsordner = Path.Combine(bezugspfad, dateiname); 

            
            if (!Directory.Exists(zielpfad))
            {
                Directory.CreateDirectory(zielpfad);

            }
            
            

                File.Copy(bezugsordner, zielordner, true);


            

           
        }


... Und schon stellen wir den nächsten Fehler fest:

"Eine nicht behandelte Ausnahme des Typs "System.IO.FileNotFoundException" ist in mscorlib.dll aufgetreten.

Zusätzliche Informationen: Die Datei "C:\Users\Test.txt" konnte nicht gefunden werden."

Es ist doch schon recht mühselig, mit Verzeichnisstrukturen zu arbeiten. Die Datei wird nicht gefunden, obgleich sie dort hinterlegt ist.

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt


Christian S. - Mo 11.06.12 23:36

Wenn sie da läge, würde sie gefunden. ;)

Sicher, dass die direkt im Ordner "c:\users" liegt und nicht im Ordner für das entsprechende Benutzerprofil?


1Csharpuser - Di 12.06.12 00:01

user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:
Wenn sie da läge, würde sie gefunden. ;)

Sicher, dass die direkt im Ordner "c:\users" liegt und nicht im Ordner für das entsprechende Benutzerprofil?


Ja !
Es ist mir wirklich so langsam ein Rätsel.


mats74 - Di 12.06.12 07:37

Hallo

Folgender Code funktioniert bei mir:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
string zielpfad = @"C:\Hallo";
            string dateiname = @"Hallo.txt";

            if (!Directory.Exists(zielpfad))
            {
                Directory.CreateDirectory(zielpfad);
            }

            // Folgende Anweisung wirft eine Exception
            // da andere Prozesse oder anderer Code erst auf die Datei zugreifen können,
            // wenn das ursprüngliche Dateihandle geschlossen wird.
            //if (!File.Exists(@"C:\Temp\Hallo.txt"))
            //{
            //    File.Create(@"C:\Temp\Hallo.txt");
            //}

            File.Copy(@"C:\Temp\Hallo.txt", zielpfad + @"\" + dateiname, true);

Beachte den Hinweis [http://msdn.microsoft.com/de-de/library/d62kzs03.aspx] bei der Create-Methode, die den Zugriff für andere Prozesse blockiert bis das Handle abgeschlossen ist.

Vielleicht hilft Dir das dein Problem zu lösen.

Edit:
Ich benütze bei solchen Aufgaben meistens die FileStream-, StreamWriter- und StringBuilder-Klassen direkt anstelle der File-Klasse.
Es entfällt nützlicherweise dabei die Handle-Exception beim Zugriff durch andere Prozesse und man hat einige Möglichkeiten mehr bei der Datenverarbeitung der Dateiinhalte zur Verfügung.


ujr - Di 12.06.12 12:09

Hallo,

die Datei heißt nicht zufällig "test.txt.txt"? Probier's mal damit.


1Csharpuser - Di 12.06.12 22:30

user profile iconujr hat folgendes geschrieben Zum zitierten Posting springen:
Hallo,

die Datei heißt nicht zufällig "test.txt.txt"? Probier's mal damit.


Exakt !
Mensch, dies hätte mir doch früher auffallen müssen, die Datei war tatsächlich als Test.txt.txt im Ordner hinterlegt, dann ist es ja ganz klar, dass sie nicht auffindbar ist. Jedenfalls funktioniert der Kopiervorgang nun reibungslos.

Ein Dankeschön an alle die geholfen haben !