Laden...

Hardlink reference counter auslesen

Erstellt von ct2034 vor 12 Jahren Letzter Beitrag vor 12 Jahren 2.462 Views
ct2034 Themenstarter:in
3 Beiträge seit 2011
vor 12 Jahren
Hardlink reference counter auslesen

Hallo liebes Forum,

ich entwickle zur Zeit ein Programm, welches source files via Hardlinks (CreateHardLink Function) spiegeln soll, auch um Redundanzen aufzuheben.
Nun ist es bei NTFS Hardlinks aber so, dass die maximale Anzahl von HLs auf 1023 beschränkt ist. (offensichtlich eine 10bit variable) Da ich aber die Kapazität nicht darauf beschränken möchte, muss ich irgendwie an die aktuelle Referenzzahl kommen. Ist das möglich? Gibt es da eine Function, die ich bisher nicht gefunden habe?

Vielen Dank,
Christian

G
538 Beiträge seit 2008
vor 12 Jahren

Zitat aus Flexhex.com:

To get the number of links use the Win32 API function GetFileInformationByHandle. The nNumberOfLinks member of the returned BY_HANDLE_FILE_INFORMATION structure contains the total number of links (a value of 1 means there are no hard links).

Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)

G
538 Beiträge seit 2008
vor 12 Jahren

Kurzer Hinweis noch:
Hardlinks eignen sich NICHT zur Spiegelung.
Eine Spiegelung legt Dateien mehrfach ab. Ein Hardlink gibt einer Datei nur mehrere Namen.

Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)

2.891 Beiträge seit 2004
vor 12 Jahren

ich entwickle zur Zeit ein Programm, welches source files [...] spiegeln soll, auch um Redundanzen aufzuheben.

Willst du da mal genauer drauf eingehen? Mit "source files" sind Quellcodedateien gemeint?

F
10.010 Beiträge seit 2004
vor 12 Jahren

Und das vorhandene und vielfach erprobte rsync ist nicht gewollt?

ct2034 Themenstarter:in
3 Beiträge seit 2011
vor 12 Jahren

Hi,

vielen Dank soweit.
Ja, damit sind Quellcodedateien gemeint, und ich weiß was Hardlinks sind. Im Prinzip kopiere ich damit das rsync-Prinzip. Aber eben als kleines Kommandozeilenprogramm.

Die Funktion GetFileInformationByHandle habe ich auch schon gefunden, aber wie kann ich die in C# einsetzen?

Christian

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo ct2034,

==> DllImport, P/Invoke. Bitte informiere dich selbst. Vielen Dank!

Eine abschließende Lösung kannst du natürlich gerne posten.

herbivore

2.891 Beiträge seit 2004
vor 12 Jahren

Ja, damit sind Quellcodedateien gemeint[...]

Im Visual Studio kann man (Quellcode-)Dateien auch als Verweis einbinden.
Ich weiß ja nicht, was du genau vorhast, aber vll. kannst du dir die Hardlinks so auch sparen.

ct2034 Themenstarter:in
3 Beiträge seit 2011
vor 12 Jahren

Hi,

danke für den Hinweis mit PInvoke. Also ich habs jetzt so gemacht:


        struct BY_HANDLE_FILE_INFORMATION 
        {
            public uint FileAttributes;
            public FILETIME CreationTime;
            public FILETIME LastAccessTime;
            public FILETIME LastWriteTime;
            public uint VolumeSerialNumber;
            public uint FileSizeHigh;
            public uint FileSizeLow;
            public uint NumberOfLinks;
            public uint FileIndexHigh;
            public uint FileIndexLow;
        }

[DllImport("kernel32.dll", SetLastError = true)] 
static extern bool GetFileInformationByHandle(IntPtr hFile, out BY_HANDLE_FILE_INFORMATION lpFileInformation);

        private static uint CheckReferenceCounter(string _filepath)
        {
            BY_HANDLE_FILE_INFORMATION bhfi = new BY_HANDLE_FILE_INFORMATION();
            FileStream fs = File.Create(_filepath);

            GetFileInformationByHandle(fs.Handle, out bhfi);

            return bhfi.NumberOfLinks;
        }

und es funktioniert... 😃 Danke