Frage

Ich möchte ein Programm, das zeigt die Dateien eines anderen Laufwerk mit harten Links schreiben. Ich mag beiden Hardlinks konsistent halten in Dateinamen und andere Dinge, damit ich eine Funktion / Methode zu bekommen, wo ich alle aktuellen Hard-Links einer Datei auflisten kann.

So zum Beispiel:

Ich habe eine Datei C: \ file.txt und eine zweite feste Verbindung zu D: \ file.txt
. Dann benenne ich D: \ file.txt nach D: \ file_new.txt. Ich mag nun in der Lage sein, auch als auch den Hardlink auf dem Laufwerk C zu umbenennen.
Also muss ich eine Funktion, die Renditen für D: \ file_new.txt es folgende harte Links sind:
C: \ file.txt
D: \ file_new.txt
dann kann ich die feste Verbindung auf C umbenennen: \ auch D zu erhalten: \ file_new.txt

Also brauche ich alle Hardlinks einer physischen Datei zu erhalten. Oder: Alle harten Links einer Datei adressierten mit einem harten Link

.

Hope jemand kann helfen!

Edit:

Oliver bemerkt, dass harte Links nicht auf differnt Festplatten verwendet werden. Dank ... So habe ich die Frage zu erweitern: Was brauche ich? Junction-Punkte? Symbolische Links? Es sollte auch die Arbeit mit Dateien nicht nur mit Ordnern!

War es hilfreich?

Lösung 4

ich eine Lösung gefunden:

Zuerst habe ich nicht hart Links verwenden (da sie nicht auf eine andere Festplatte zeigen kann). Ich habe stattdessen symbolische Links zu verwenden. Also ich habe eine harte verknüpfte Datei auf dem ursprünglichen Datenträger und symbolische Links auf andere Datenträger auf diese Datei. Die Begrenzung ist O muss Vista oder höher sein.

Second ich muß in der Lage sein, um herauszufinden, wo die symbolische Verbindung zu zeigt. Hier fand ich ein gutes Beispiel dafür, wie die Informationen die ich brauche, um herauszufinden: http://www.codeproject.com/KB/vista/ReparsePointID.aspx

Das einzige, was ich es geschafft, nicht wissen, ist alle symbolischen Links von einer bestimmten Datei (Hardlink) zu finden. Ich denke, es ist nicht aus der Box-Lösung, und ich habe alle symbolischen Links Rekursion und das Ziel zu testen. Aber in meinem Fall, das ist kein Problem.

Ich hoffe, das kann anderen helfen!

Andere Tipps

Der folgende Code sollte gut funktionieren (ursprünglich postet von Peter Propst auf Powershell-Code Repository):

using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
using Microsoft.Win32.SafeHandles;
using FILETIME = System.Runtime.InteropServices.ComTypes.FILETIME;

namespace HardLinkEnumerator
{
   public static class Kernel32Api
   {
       [StructLayout(LayoutKind.Sequential)]
       public 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, CharSet = CharSet.Auto)]
       static extern SafeFileHandle CreateFile(
           string lpFileName,
           [MarshalAs(UnmanagedType.U4)] FileAccess dwDesiredAccess,
           [MarshalAs(UnmanagedType.U4)] FileShare dwShareMode,
           IntPtr lpSecurityAttributes,
           [MarshalAs(UnmanagedType.U4)] FileMode dwCreationDisposition,
           [MarshalAs(UnmanagedType.U4)] FileAttributes dwFlagsAndAttributes,
           IntPtr hTemplateFile);

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

       [DllImport("kernel32.dll", SetLastError = true)]
       [return: MarshalAs(UnmanagedType.Bool)]
       static extern bool CloseHandle(SafeHandle hObject);

       [DllImport("kernel32.dll", SetLastError=true, CharSet=CharSet.Unicode)]
       static extern IntPtr FindFirstFileNameW(
           string lpFileName,
           uint dwFlags,
           ref uint stringLength,
           StringBuilder fileName);

       [DllImport("kernel32.dll", SetLastError = true, CharSet=CharSet.Unicode)]
       static extern bool FindNextFileNameW(
           IntPtr hFindStream,
           ref uint stringLength,
           StringBuilder fileName);

       [DllImport("kernel32.dll", SetLastError = true)]
       static extern bool FindClose(IntPtr fFindHandle);

       [DllImport("kernel32.dll")]
       static extern bool GetVolumePathName(string lpszFileName,
           [Out] StringBuilder lpszVolumePathName, uint cchBufferLength);

       [DllImport("shlwapi.dll", CharSet = CharSet.Auto)]
       static extern bool PathAppend([In, Out] StringBuilder pszPath, string pszMore);

       public static int GetFileLinkCount(string filepath)
       {
           int result = 0;
           SafeFileHandle handle = CreateFile(filepath, FileAccess.Read, FileShare.Read, IntPtr.Zero, FileMode.Open, FileAttributes.Archive, IntPtr.Zero);
           BY_HANDLE_FILE_INFORMATION fileInfo = new BY_HANDLE_FILE_INFORMATION();
           if (GetFileInformationByHandle(handle, out fileInfo))
               result = (int)fileInfo.NumberOfLinks;
           CloseHandle(handle);
           return result;
       }

       public static string[] GetFileSiblingHardLinks(string filepath)
       {
           List<string> result = new List<string>();
           uint stringLength = 256;
           StringBuilder sb = new StringBuilder(256);
           GetVolumePathName(filepath, sb, stringLength);
           string volume = sb.ToString();
           sb.Length = 0; stringLength = 256;
           IntPtr findHandle = FindFirstFileNameW(filepath, 0, ref stringLength, sb);
           if (findHandle.ToInt32() != -1)
           {
               do
               {
                   StringBuilder pathSb = new StringBuilder(volume, 256);
                   PathAppend(pathSb, sb.ToString());
                   result.Add(pathSb.ToString());
                   sb.Length = 0; stringLength = 256;
               } while (FindNextFileNameW(findHandle, ref stringLength, sb));
               FindClose(findHandle);
               return result.ToArray();
           }
           return null;
       }

   }
}

Vielleicht i falsch verstehen Ihre Fragen, aber harte Links können nicht von einem Laufwerk auf ein anderes gehen. Sie können nur auf einem einzigen Laufwerk vorhanden sein.

Im Rahmen der .Net Framwork gibt es keine Unterstützung, um diese Informationen zu erhalten. Aber die Win32-API können Sie mit diesen Informationen nicht zur Verfügung stellen.

Hier finden Sie aktuelle diesem Artikel . Es kann Ihnen helfen.

Update

Soweit ich weiß, es ist nicht möglich, es zwischen verschiedenen Laufwerken zu tun. Junction-Punkte sind auf jeden Fall nicht Ihr Freund weil es nur auf Foldes funktioniert. Aber nach diesen Wikipedia-Artikel es scheint, dass Sie es auf Vista und Win7 mit symbolischen Links zu tun. Es gibt auch einen Link zu diese Shell-Erweiterung , die Abdeckung scheint alles was Sie tun können mit diesen NTFS Besonderheiten. Vielleicht mit diesem können Sie überprüfen, ob Ihr Ziel erreichbar ist, und vielleicht danach die MSDN überprüfen Sie die API-Funktion gewünscht Win32.

versuchen:

using System.IO;

string[] filePathsC = Directory.GetFiles(@"c:\");
string[] filePathsD = Directory.GetFiles(@"d:\");

und Schleife durch die Felder, um die Dateien zu finden und den Namen ändern

EDIT: Durch das Lesen der Kommentare weiß ich, dass ich antwortete, bevor ich wusste, was ein Hardlink ist. Ich weiß jetzt, dass diese Antwort ist nicht zu helfen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top