Question

Existe-t-il un moyen, dans le cadre .net, de vérifier si deux dossiers partagés différents pointent réellement vers le même répertoire physique? Les répertoires dans Windows ont-ils une sorte d'identifiant unique? Google-fu me manque.

(Je veux dire, à part écrire un fichier temporaire dans un fichier et voir s'il apparaît dans l'autre)

Edit: Je pense avoir découvert ce dont j'avais besoin. Merci à Brody de m'avoir orienté dans la bonne direction dans l'espace de noms System.Management.

Était-ce utile?

La solution 4

Je pense que les requêtes WMI prendront en charge ce que je dois faire:

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"]);
}

Et l'attribut Path me donnera le chemin physique du partage, que je peux utiliser pour comparer les deux partages.

Autres conseils

Si vous n'utilisez pas WMI, l'appel non géré est NetShareEnum avec un nom de serveur égal à NULL (ordinateur local) et un niveau de 502 pour obtenir un SHARE_INFO_502 struct. Le chemin local est dans shi502_path.

Les informations de P / Invoke sont, comme toujours, terminées à pinvoke.net.

Vous pouvez examiner la définition de partage elle-même à l'aide de l'espace de noms System.Management, mais son utilisation n'est pas facile.

il commence quelque chose comme

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

Et cela s’aggrave bien après cela. Je l'ai utilisé pour créer un partage. J'espère que vous pourrez l'utiliser pour le chemin d'accès de chaque partage et comparer.

Je pense que le framework .NET ne fournit pas les informations nécessaires pour comparer 2 répertoires ... Vous devez adopter une approche non gérée. Voici comment je l’ai fait:

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));
    }
}

Cela fonctionne! J'espère que cela vous aidera.

A bientôt.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top