Entwickler-Ecke

Sonstiges (.NET) - Partition als Buchstabe oder in Ordner


thewhiteshadow7 - So 12.08.18 14:42
Titel: Partition als Buchstabe oder in Ordner
Hallo zusammen,

Ich beschäftige mich seit kurzem nach gut 10 Jahren wieder mit C# und .Net und komme nicht so richtig an mein Ziel.

Hintergund:
Ich möchte eine Datei verschieben und dabei den Fortschritt anzeigen. Mit File.Move ist das nicht möglich, weshalb ich eine eigene Implementierung geschrieben habe.
Diese kopiert die Datei und löscht die alte Datei nach erfolgreichen Abschluss.
Allerdings ist das höchst ineffizient wenn ich mich auf derselben Partition bewege, da ein File.Move so schnell gehen würde, dass ich es gar nicht anzeigen bräuchte.

Aber: Wie ermittle ich nun ob es dieselbe Partition ist?

Ansatz:
Hierfür habe ich die Win-Funktion "GetFileInformationByHandle" gefunden, mit der ich die "Volume Serial Number" herausbekommen kann.
Allerdings benötige ich dafür eine Datei, genauer ein Dateihandle was ich über FileStream bekommen kann.
Für den Ziel-Ordner habe ich aber nur den Pfad.

Fragen:
Kann ich damit mein Ziel ebenfalls erreichen oder muss ich zuerst eine Dummy-Datei erstellen um mit dessen Handle an die "Volume Serial Number" zu kommen?
Gibt es evtl. andere Möglichkeiten um das Problem zu lösen.


Th69 - So 12.08.18 15:06

Hallo und :welcome:

schon mal Path.GetPathRoot [https://msdn.microsoft.com/de-de/library/system.io.path.getpathroot(v=vs.110).aspx] probiert?


thewhiteshadow7 - So 12.08.18 15:22

Hab ich.
Gibt leider nur den Pfad bis zum Laufwerksbuchstaben zurück.


thewhiteshadow7 - So 12.08.18 19:22

Ich habe es nun mit einer anderen Windows-Fuktion gelöst die ein Pfad akzeptiert.

Für alle, die das gleiche Problem haben:
https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-getvolumeinformationa

Diese habe ich mit folgender Definition eingebunden:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
[DllImport("kernel32.dll", SetLastError = true)]
private static extern long GetVolumeInformation(
  string PathName,
  StringBuilder VolumeNameBuffer,
  UInt32 VolumeNameSize,
  ref UInt32 VolumeSerialNumber,
  ref UInt32 MaximumComponentLength,
  ref UInt32 FileSystemFlags,
  StringBuilder FileSystemNameBuffer,
  UInt32 FileSystemNameSize);


Die Funktion erwartet ein Wurzel-Verzeichnis mit abschließendem '\'. Da ich damit aber herausfinden will, ob ich ein Wurzelverzeichnis zwichen dem Laufwerksbuchstaben und meinen Zielordner habe,
muss ich die Funktion rekursiv auf alle Ordner anwenden.


Th69 - So 12.08.18 20:32

Ich meinte damit einfach bei beiden Pfaden den Root-Ordner miteinander vergleichen (denn "C:\", "D:\", etc. sind ja verschiedene Partitionen)? Oder meintest du etwas anderes, dann wäre ein Beispiel nicht schlecht?

Oder warum möchtest du unbedingt die "Volume Serial Number" haben?