Frage

Gibt es eine Möglichkeit, innerhalb des .NET Framework, um zu überprüfen, ob zwei verschiedene gemeinsame Ordner tatsächlich auf demselben physischen Verzeichnis verweisen? Sie Verzeichnisse in Windows haben eine Art von eindeutiger Kennung? Google-fu versagt mir.

(ich meine, beiseite eine temporäre Datei zu einem vom Schreiben und sehen, ob es in dem anderes erscheint)

Edit: Ich glaube, ich habe entdeckt, was ich brauche, mit Dank an Brody für immer ich in der richtigen Richtung im System.Management Namespace zeigte

.
War es hilfreich?

Lösung 4

Ich glaube, dass WMI-Abfragen mit kümmern, was ich tun muss:

Connection options = new ConnectionOptions();
ManagementScope scpoe = new ManagementScope("\\\\Server\\root\\cimv2", options);
ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_Share WHERE Name = '" + name +"'")

ManagementObjectSearcher searcher = new ManagementObjectSearch(scope, query);
ManagementObjectCollection qc = searcher.Get();

foreach (ManagementObject m in qc) {
    Console.WriteLine(m["Path"]);
}

Und der Pfad Attribut gibt mir den physischen Pfad der Aktie, die ich verwenden kann, um die 2 Aktien zu vergleichen.

Andere Tipps

Wenn Sie nicht über WMI gehen, der nicht verwalteten Aufruf NetShareEnum mit einem server von NULL (lokaler Computer) und einer Höhe von 502 eine SHARE_INFO_502 struct. Der lokale Pfad ist in shi502_path.

P / Invoke info , wie immer, ist vorbei an pinvoke.net.

Sie können die Freigabe-Definition selbst prüfen, indem Sie den System.Management Namespace verwenden, aber es ist nicht einfach zu bedienen.

es beginnt so etwas wie

ManagementClass management = new ManagementClass("\\\\.\\root\\cimv2", "Win32_Share", null)

Und es kommt noch viel schlimmer danach. Ich habe es verwendet, um eine Freigabe zu erstellen. Hoffentlich können Sie es auf den Pfad für jede Aktie verwenden und vergleichen.

ich glaube, der .NET-Framework bietet keine Informationen, die Sie für den Vergleich von zwei Verzeichnissen benötigen ... Sie haben einen nicht verwalteten Ansatz. Dies ist, wie ich tat es:

class Program
{
    struct BY_HANDLE_FILE_INFORMATION
    {
        public uint FileAttributes;
        public System.Runtime.InteropServices.ComTypes.FILETIME CreationTime;
        public System.Runtime.InteropServices.ComTypes.FILETIME LastAccessTime;
        public System.Runtime.InteropServices.ComTypes.FILETIME LastWriteTime;
        public uint VolumeSerialNumber;
        public uint FileSizeHigh;
        public uint FileSizeLow;
        public uint NumberOfLinks;
        public uint FileIndexHigh;
        public uint FileIndexLow;
    }

    //
    // CreateFile constants
    //
    const uint FILE_SHARE_READ = 0x00000001;
    const uint FILE_SHARE_WRITE = 0x00000002;
    const uint FILE_SHARE_DELETE = 0x00000004;
    const uint OPEN_EXISTING = 3;

    const uint GENERIC_READ = (0x80000000);
    const uint GENERIC_WRITE = (0x40000000);

    const uint FILE_FLAG_NO_BUFFERING = 0x20000000;
    const uint FILE_READ_ATTRIBUTES = (0x0080);
    const uint FILE_WRITE_ATTRIBUTES = 0x0100;
    const uint ERROR_INSUFFICIENT_BUFFER = 122;
    const uint FILE_FLAG_BACKUP_SEMANTICS = 0x02000000;


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

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

    static void Main(string[] args)
    {
        string dir1 = @"C:\MyTestDir";
        string dir2 = @"\\myMachine\MyTestDir";
        Console.WriteLine(CompareDirectories(dir1, dir2));
    }

    static bool CompareDirectories(string dir1, string dir2)
    {
        BY_HANDLE_FILE_INFORMATION fileInfo1, fileInfo2;
        IntPtr ptr1 = CreateFile(dir1, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING,  FILE_FLAG_BACKUP_SEMANTICS, IntPtr.Zero);
        if ((int)ptr1 == -1)
        {
            System.ComponentModel.Win32Exception t = new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error());
            Console.WriteLine(dir1 + ": " + t.Message);
            return false;
        }
        IntPtr ptr2 = CreateFile(dir2, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING,  FILE_FLAG_BACKUP_SEMANTICS, IntPtr.Zero);
        if ((int)ptr2 == -1)
        {
            System.ComponentModel.Win32Exception t = new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error());
            Console.WriteLine(dir2 + ": " + t.Message);
            return false;
        }
        GetFileInformationByHandle(ptr1, out fileInfo1);
        GetFileInformationByHandle(ptr2, out fileInfo2);

        return ((fileInfo1.FileIndexHigh == fileInfo2.FileIndexHigh) &&
            (fileInfo1.FileIndexLow == fileInfo2.FileIndexLow));
    }
}

Es funktioniert! Hoffe, das hilft.

Prost.

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