Frage

HINTERGRUND

Ich muss ein Tool mit .NET Version 2.0 am höchsten schreiben (mit etwas außerhalb des Regals ist für diesen Kunden keine Option für politische, kommerzielle und Vertraulichkeit/Vertrauensgründe), um Dateien von einem Server auf ein anderes über das Netzwerk zu migrieren. Die Server sind Dateiserver für lokale Teams, und bestimmte Teamordner müssen auf andere Server migriert werden, um eine Reorganisation zu erleichtern. Die Grundidee ist, dass wir jede Datei lesen und sie aus Stunden über das Netzwerk streamen, und nach einigen Tagen werden die Daten migriert. Dateiberechtigungen müssen erhalten werden. Da dies einige Tage dauern wird (wir sprechen für einige Teams für einige Teams), müssen wir jede Nacht über die Dateien iterieren und die Änderungsdaten vergleichen und diejenigen aktualisieren, die sich geändert haben. Die Theorie ist, dass der neue Server irgendwann über eine aktuelle Kopie der Dateien verfügt und die Benutzer auf den neuen Server wechseln können. Es ist natürlich nicht ganz so einfach, aber wir haben ein Design, von dem wir glauben, dass es funktionieren sollte :)

DAS PROBLEM

Theoretisch öffnen wir die Datei einfach, streamen sie über das Netzwerk und schreiben sie am anderen Ende, oder? :)

Leider wurden auf den Servern selbst die Dateianteile auf Ordnerpfaden erstellt, wie z. B.:

D: Data Team Shares Division Abteilung Name des Teams - könnte ziemlich lang sein

Für jeden Benutzer wird dieser Pfad einem Laufwerk zugeordnet, zum Beispiel würde er als Server TeamName geteilt und dem t: Laufwerk zugeordnet.

Dies hat die Situation verursacht, in der die Dateien als sichtbar aus dem T: Laufwerk sind MAX_PATH Einschränkung, wenn sie jedoch lokal auf dem Server selbst betrachtet werden, gehen sie weit darüber hinaus. Wir können nicht auf die Dateien zugreifen, indem wir die Netzwerkfreigaben übernehmen, da dieses Tool generisch sein muss, um auf Hunderten dieser Server auszuführen, und es gibt keine Standardmethode, um zu sagen Kein Naming -Konvention Standard. Gelegentlich gibt es Unterlagen anderer Aktien und so übertreffen wir die MAX_PATH zweimal einschränken!

Ich bin mir der Problemumgehung bewusst, um Wege mit dem Präfix "?" Anzugeben, das den Pfad als UNC -Pfad behandelt und ein theoretisches Maximum von 32K -Zeichen ermöglicht.

Diese Problemumgehung wird auf der Win32 -API -Ebene implementiert. Der system.IO -Namespace ist (meistens) im Grunde genommen nur ein dünner Wrapper um native Win32 -API -Funktionen . In diesem Fall lehnt das .NET -Framework den Pfad ab, weil er behauptet, dass '?' ist ein ungültiger Pfadcharakter.

Meine Frage ist also ... Gibt es eine Möglichkeit, wie ich nicht gedacht habe, dass ich das umgehen kann, ohne das fast das gesamte System des Systems vollständig umschreiben zu müssen, um eine Ladung P/Invoke -Anrufe zu tätigen, nur zu Entfernen Sie diese nervige Validierung?

War es hilfreich?

Lösung

Das BCL -Team hat eine 3 -teilige Serie darüber gemacht, warum diese Auswahlmöglichkeiten getroffen wurden und was die Arbeiten sind. Wenn Sie das noch nicht gelesen haben, schlage ich vor, dass es eine großartige Informationsquelle zu diesem Thema ist

Andere Tipps

Ich bin auf eine Lösung von Drittanbietern gestoßen, die helfen kann: Alphafs.

Es sollte ziemlich einfach sein, diese Einschränkung mit ein wenig Plattform aufzurufen, vorausgesetzt, Ihre Software hat die erforderlichen Berechtigungen:

[DllImport("kernel32.dll", SetLastError = true)]
static extern SafeFileHandle CreateFile(string lpFileName, uint dwDesiredAccess,
  uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition,
  uint dwFlagsAndAttributes, IntPtr hTemplateFile);

// Must close/dispose handle separately from FileStream since it's not owned by
// that object when passed to constructor.
using (SafeFileHandle h = CreateFile(longUncPath, GENERIC_WRITE, 0, IntPtr.Zero, 
       OPEN_EXISTING, 0, IntPtr.Zero))
{
    using (var fs = new FileStream(h, FileAccess.Read))
    {
        // operations with FileStream object
    }
}

Sie können versuchen, den Pfad zu verkürzen, indem Sie ein übergeordnetes Verzeichnis mit Subst.exe (oder allen APIs, die es intern verwendet) abzubilden:

http://www.makeseof.com/tag/how-to-map-a--local-windows-brolder-to-----drive-letter/

Idealerweise würden Sie so viel wie möglich vom Pfad abbilden.

Ich hatte Erfolg beim Löschen von Verzeichnisstrukturen mit dem folgenden kleinen Skript. Pushd verwendet das UNC -Format, das Ihnen 32K anstelle von 260 Einschränkungen gibt

set "folder=\\SERVER\SHARE\DIVISION\DEPARTMENT\NAME OF TEAM - COULD BE FAIRLY LONG\" 
pushd "%folder%"
for /d %%i in ("*") do rmdir "%%i" /s /q
popd
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top