Laden...

FileSystem.FileCopy: "Der Zugriff auf die Clouddatei wurde verweigert."

Erstellt von Wühlmaus vor einem Jahr Letzter Beitrag vor einem Jahr 709 Views
W
Wühlmaus Themenstarter:in
5 Beiträge seit 2020
vor einem Jahr
FileSystem.FileCopy: "Der Zugriff auf die Clouddatei wurde verweigert."

Hi,

ich (wohl immer noch blutiger Anfänger) schreibe gerade an einem C#-Programm, welches eine sehr spezielle Verwaltung meiner Bilddateien bewirken soll. Ein Kernstück dessen ist das Kopieren ganzer Fotoprojekte oder -jahrgänge - ja selbst meines gesamten Bildarchivs - auf externe USB-Laufwerke, aber auch auf mein OneDrive bzw. das selektive Rückholen von denselben.

Für die Verzeichnis- und Dateioperationen verwende ich Methodenaufrufe wie


Microsoft.VisualBasic.FileIO.FileSystem.CopyFile(sourceFilePath, targetFilePath); 

(Die VB-Version deshalb, weil sie für das Löschen von Dateien und Verzeichnissen den Papierkorb anbietet.)

Das alles funktioniert solange, wie die beteiligten Laufwerke entweder vom Typ SSD (meiner Workstation) oder USB-HDD (typisch 100 bis 150 MByte/s) sind. Wenn ich aber einen Bulk Transfer von meinem OneDrive starte, kommt nach wenigen Dateien der Absturz:

Fehlermeldung:
"System.IO.IOException: Der Zugriff auf die Clouddatei wurde verweigert."

Wenn ich mein Programm dann neu starte, erreicht es sehr schnell den Punkt des Absturzes und macht dann aber naht- und problemlos weiter - was eben noch als mysteriöses Zugriffsproblem erschien, ist plötzlich keines mehr. Daher helfen all die vielen tollen Ratschläge im Netz, ich solle gefälligst die Zugriffrechte korrekt vergeben oder im Zweifel meinen Admin fragen, nicht weiter. Auch greifen meines Wissens keine anderen Apps auf die fraglichen Dateien zu. Allerdings sollte ich anmerken, dass meine auf OneDrive gelagerten Bilder absichtlich nicht lokal gespiegelt sind, sondern bei jedem Transfer ein echter Download (mit 40 bis 50 MBit/s) involviert ist. Die größten Dateien - im Nikon-Raw-Format .NEF - haben einen Umfang von typisch 30 MByte, maximal etwas darüber. Der Download eines solchen Bildes kann also schon mal 10s dauern.

Über solche nur temporären Zugriffsverweigerungen konnte ich bisher in der MSDN-Doku und anderswo im Netz nichts Zutreffendes finden - ich tippe mal auf einen Timeout in der CopyFile-Methode. Ich versuche nun, einen Exception Handler für dieses Problem zu schreiben, komme aber nicht recht weiter. Insbesondere finde ich kein vernünftiges Kriterium für das Verschwinden dieser temporären Zugriffsverweigerung, mit welchem ich eine Wiederholungsschleife verlassen könnte. Das Objekt "FileInfo" liefert mir auch keinen brauchbaren Hinweis. Wenn ich aber im CATCH-Abschnitt das CopyFile, welches vorher in TRY zum Absturz führte, sofort noch einmal wiederhole, dann klappt es anscheinend. Natürlich kann ich da noch weiter herumwurschteln und so sicher eine praxistaugliche Lösung hinwürgen. Aber ich würde doch gerne verstehen, was da eigentlich warum passiert und wie ein sauberes und wasserdichtes Exception Handling für diesen Fall aussehen müsste.

Hat jemand eine Idee ?

LG Christoph

16.842 Beiträge seit 2008
vor einem Jahr

Der Fehler kommt durch OneDrive.

OneDrive ist mittlerweile Tief in Windows integriert, auch im Dateisystem.
Eines dieser Feature ist, dass Dateien im Explorer zwar zu sehen sind - in Wirklichkeit aber eben in der Cloud liegen.
Beim Zugriff über den Explorer wird die Datei dann "lazy" heruntergeladen; also erst, wenn man sie braucht.
Da die Datei also physikalisch gar nicht auf Deinem Dateisystem existiert, sondern nur ein Verweis, kannst Du sie nicht so einfach kopieren.

Das hat selbst aber nichts mit .NET zutun, sondern einfach wie das File System reagiert.
Hab jetzt dazu keinen Workaround im Kopf, aber vermutlich die Datei erst manuell lesen damit sie angefragt und heruntergeladen wird, und dann kopiere, könnte einer sein.

Oder Du machst es Dir einfach: alle Dateien von OneDrive runter ziehen (Rechtsklick -> Always keep on this device)

W
Wühlmaus Themenstarter:in
5 Beiträge seit 2020
vor einem Jahr

Danke dir, sowas habe ich mir ja fast gedacht. Sehr seltsam, dass dann ein "access denied" kommt, welches man ja eher mit Zugriffsrechten als mit Lahmheit des Dateisystems verbinden würde.

Mein - total wissensbefreiter - Workaround, nämlich den COPY-Befehl beim Auftreten der Exception einfach sofort "blind" noch einmal auszuführen, funktioniert bisher. Daraus schließe ich, dass die Blockierung offenbar ein nur sehr transientes Verhalten ist.

Klar, wenn ich alle Dateien lokal halte, tritt das Problem nicht auf. Aber meine Fotosammlung umfasst jetzt schon 170 GB😲 und mit Video habe ich noch gar nicht richtig angefangen.😉

Vielleicht muss ich auch noch mal über meinen Foto-Workflow nachdenken. Früher (vor OneDrive) hatte ich meine Fotos auf drei USB-Drives identisch gesichert. Die waren niemals konsistent, deshalb der Angang mit einer eigenen Bildverwaltung. Dann kam OneDrive dazu, welches ich zunächst vor allem dazu nutzte, meine (nach JPG konvertierten) Fotos im engsten Kreis zu veröffentlichen. Da hatte ich die Idee, ich könnte Onedrive zum "Master" machen und es bei vielleicht einer Angst-Kopie auf nur einem USB-Drive belassen. Aber mit der lausigen DSL-Anbindung kann ich das vergessen. Der Glasfaser-Vorvertrag ist zwar unterschrieben, aber die Bagger wurden in unserem Dorf noch nicht gesichtet.😉 Solange muss halt das Schreiben nach OneDrive (was natürlich problemlos und blitzschnell geschieht) die Einbahnstraße sein.

LG Christoph

16.842 Beiträge seit 2008
vor einem Jahr

Danke dir, sowas habe ich mir ja fast gedacht. Sehr seltsam, dass dann ein "access denied" kommt, welches man ja eher mit Zugriffsrechten als mit Lahmheit des Dateisystems verbinden würde.

Access Denied heisst ja nur, dass der Zugriff abgelehnt wurde. Die Erklärung steht ja deutlich im Text: Der Zugriff auf die Clouddatei wurde verweigert.
Da steht nichts von Zugriffsrechten aka Permissions. Das interpretierst Du einfach hinein.