Problem mit Kopieren von Dateien

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Andy.

    Problem mit Kopieren von Dateien

    Hallo, ich habe ja mein Backup Tool. Welches soweit auch gut funktioniert. Nun dachte ich mir, ich könnte ja den Ordner meiner Visual Studio Projekte sichern. Soweit so gut, bis ich auf meinen twitch chat bot gestoßen bin. Hier können nämlich diverse Dateien nicht kopiert werden und auch der Fehler ist ganz "speziell". Denn ich bekomme einen DirectoryNotFoundException bei der datei TwitchLib.Api.Core.Enums.GeneratedMSBuildEditorConfig.editorconfig. Ich nutze für das Kopieren der Ordner eine eigene Funktion

    C#-Quellcode

    1. public static void CopyDirectory(string path, string destination)
    2. {
    3. // Create new Directory
    4. DirectoryInfo directoryInfo = new DirectoryInfo(path);
    5. if (!Directory.Exists(destination))
    6. {
    7. Directory.CreateDirectory(destination);
    8. }
    9. // Copy files
    10. FileInfo[] files = directoryInfo.GetFiles();
    11. foreach (var item in files)
    12. {
    13. String destFile = Path.Combine(destination, item.Name);
    14. try
    15. {
    16. System.IO.File.Copy(item.FullName, destFile);
    17. }
    18. catch (Exception ex)
    19. {
    20. MessageBox.Show("Unable to copy file " + item.Name + "\n \n" + ex.Message, "Unable to copy file", MessageBoxButtons.OK, MessageBoxIcon.Warning);
    21. }
    22. //if(!CopyFile(item.FullName, destination + "/" + item.Name, false))
    23. //{
    24. // MessageBox.Show("Cant copy file " + item.FullName, "Cant copy file", MessageBoxButtons.OK, MessageBoxIcon.Information);
    25. //}
    26. }
    27. // Copy subdirs
    28. DirectoryInfo[] dirs = directoryInfo.GetDirectories();
    29. foreach (DirectoryInfo directory in dirs)
    30. {
    31. String destDir = Path.Combine(destination, directory.Name);
    32. CopyDirectory(directory.FullName, destDir);
    33. }
    34. }


    das was aus kommentiert ist, ist ein PInvoke von

    C#-Quellcode

    1. [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    2. static extern bool CopyFile(string lpExistingFileName, string lpNewFileName, bool bFailIfExists);


    Ich habe auch versucht eine "test" datei in dem Zielverzeichniss zu erstellen, was ohne probleme funktioniert hat. Weswegen ich der Vermutung bin, dass es was mit dem Datei Namen zu tun hat, denn ich konnte die Test Datei nicht mit dem Namen TwitchLib.Api.Core.Enums.GeneratedMSBuildEditorConfig.editorconfig bennen. Aber mit Test.txt ging es.

    Es ist auch so, dass mehrere Dateien aus dieser besagten Libary sich nicht kopieren lassen. Die anderen Projekte haben sich ohne Probleme kopieren lassen.

    @Andy Du arbeitest mit FileInfo.
    Warum arbeitest Du nicht mit FileInfo.CopyTo()?
    learn.microsoft.com/de-de/dotn…yto?view=netframework-4.8
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich hab ein wenig damit gespielt, es funktioniert gut.
    Unteresuche mal die Bedingungen, unter denen das knallt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Könnte das ein Problem wegen MAX_PATH (Constante für maximale Pfadlänge) sein? Default soll der Wert ja 256 sein, dein Pfad mit Dateiname ist 270 Zeichen lang. Du kannst aber im selben Verzeichniss eine Datei mit kurzen Namen erstellen. Versuch mal eine Datei im selben Ordner zu erstellen, mit einem anderen aber gleich langen Dateinamen.

    Auf welchen OS läuft das?
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    Hallo, es läuft auf windows. Bis jetzt macht auch nur diese Lib problemme. Alles andere geht sehr gut. Das mit dem langen namen werde ich auch versuchen. Wobei mit dem Pinvoke hat es auch nicht funktioniert und da ist so viel ich weiß, die Pfadlänge egal.
    Hi

    Die max. Pfadlänge spielt bei diversen APIs leider immer noch eine Rolle. Nun müsste man mal mit ILSpy nachschauen, welche APIs .Net da verwendet. Wenn es wirklich an den von .Net verwendeten APIs liegt, dann müsstest auf modernere Schnittstellen ausweichen. z. B. auf das Interface IFileOperation oder auf das WinRT Interface IStorageFile.

    Edit: zu PInvoke CopyFile -> In the ANSI version of this function, the name is limited to MAX_PATH characters. To extend this limit to 32,767 wide characters, call the Unicode version of the function and prepend "\?" to the path.

    wobei das prepend "\?" nicht stimmen sollte. Eher das was im nachfolgendem Text steht.

    Starting with Windows 10, version 1607, for the unicode version of this function (CopyFileW), you can opt-in to remove the MAX_PATH limitation without prepending "\\?\". See the "Maximum Path Length Limitation" section of Naming Files, Paths, and Namespaces for details.

    learn.microsoft.com/en-us/wind…nbase/nf-winbase-copyfile
    Mfg -Franky-

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „-Franky-“ ()

    Ich hab keine Ahnung wie das bei diversen APIs/LIBs aussieht, da hatte ich das bisher nicht, bei Anwendungen hatte ich das durchaus des öfteren. Das wohl berühmteste Programm bei dem ich da das Problem festgestellt hab, ist der VLC Player. Der spielt keine Datei ab, wenn der Pfad zu lang ist.

    @Andy "Windows" sagt nicht viel aus wenn jemand nach dem OS fragt, das du Windows verwendest hat mir dein Pfad schon verraten. Mit Win7(Win8 hab ich übersprungen) hatte ich das letzte mal Probleme mit zu langen Pfaden beim programmieren.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „DTF“ ()

    Es liegt tatsächlich an der pfad länge. Das Problemm ist nun, dass ich die erstellte Zip file nicht mehr unzippen kann

    ​System.IO.Compression.ZipFile.ExtractToDirectory(@"\\?\" + backubFilePath, @"\\?\" + workingDir);

    C-Quellcode

    1. ​System.IO.IOException
    2. HResult=0x8007007B
    3. Nachricht = Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung ist falsch.
    4. Quelle = mscorlib
    5. Stapelüberwachung:
    6. at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
    7. at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
    8. at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share)
    9. at System.IO.Compression.ZipFileExtensions.ExtractToFile(ZipArchiveEntry source, String destinationFileName, Boolean overwrite)
    10. at System.IO.Compression.ZipFileExtensions.ExtractToDirectory(ZipArchive source, String destinationDirectoryName)
    11. at System.IO.Compression.ZipFile.ExtractToDirectory(String sourceArchiveFileName, String destinationDirectoryName, Encoding entryNameEncoding)
    12. at System.IO.Compression.ZipFile.ExtractToDirectory(String sourceArchiveFileName, String destinationDirectoryName)
    13. at SmartBackup.RestorBackup.restorBackup(String customdir) in C:\Users\andy1\source\repos\SmartBackup\SmartBackup\RestorBackup.cs:line 98
    14. at SmartBackup.RestorBackup.<>c__DisplayClass5_0.<button3_Click>b__0() in C:\Users\andy1\source\repos\SmartBackup\SmartBackup\RestorBackup.cs:line 61
    15. at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
    16. at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
    17. at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
    18. at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
    19. at System.Threading.ThreadHelper.ThreadStart()
    Du könntest versuchen das woanders zu entpacken wo der Pfad kürzer ist. Z.B. "C:\Users\User\AppData\Local\Temp" und dann blöderweise alles verschieben. Keine Lösung, aber ein temporärer Workaround bis sich was findet.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „DTF“ ()

    Das müsste man dann mal mit NET6/7 probieren, der Thread ist mit NetFX getagt und das wird nun mal nicht weiter entwickelt.
    Edit @Andy
    Du könntest das entpacken ja mal mit NET probieren sind nur wenige Zeilen Code und uns dann berichten.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    AFAIK geht das nicht. Aber es gäbe bestimmt alternativen. Gibt ja echt für alles Mögliche Nuget-Packete. Ist dann leider wohl mit Codeänderungen verbunden, aber dann hast du das hinter dir und musst evtl. nicht in X Jahren upgraden.

    Edit @Andy Klar kannste eine NET DLL in einer NET Anwendung verwenden, du meintest wohl eine NetFX-Dll in einer NET Anwendung, habs jetzt erst richtig gelesen, das würde nicht gehen.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „DTF“ ()