Domanda

Voglio scrivere un programma che mostra i file di un altro disco con hard link. Voglio mantenere entrambi i collegamenti fisici coerenti nel nome del file e altre cose quindi devo trovare una funzione / metodo in cui posso elencare tutti gli hard link corrente di un file.

Così, per esempio:

Ho un file C: \ file.txt e un secondo hard link a D: \ file.txt
. Poi cambio titolo D: \ file.txt a D: \ file_new.txt. Ora voglio essere in grado di rinominare anche il collegamento reale sull'unità C come bene.
Quindi ho bisogno di una funzione che restituisce per D: \ file_new.txt vi sono le seguenti collegamenti fisici:
C: \ file.txt
D: \ file_new.txt
allora posso rinominare il hard link su C: \ anche per ottenere D: \ file_new.txt

Quindi ho bisogno di ottenere tutti i collegamenti reali di un file fisico. Oppure: Tutti gli hard link di un file indirizzati con un hard link

.

La speranza qualcuno può aiutare!

Modifica:

Oliver notò che i collegamenti fissi non possono essere utilizzati su dischi differnt. grazie ... Così estendo la domanda a: Di cosa ho bisogno? Punti di giunzione? Collegamenti simbolici? Dovrebbe funzionare anche con i file non solo con le cartelle!

È stato utile?

Soluzione 4

Ho trovato una soluzione:

Per prima cosa non devo utilizzare hard link (dal momento che non possono puntare a un altro disco). Devo usare i link simbolici invece. Così ho un file collegato duro sul disco originale e collegamenti simbolici su altri dischi a questo file. La limitazione è operativo deve essere Vista o più recente.

In secondo luogo devo essere in grado di scoprire dove il collegamento simbolico che punta a. Qui ho trovato un buon esempio come trovare l'esigenza informazioni che: http://www.codeproject.com/KB/vista/ReparsePointID.aspx

L'unica cosa che non sono riuscito è quello di trovare tutti i link simbolici da un file specifico (hard link). Credo che non v'è dalla soluzione scatola e devo ricorsivamente tutti i link simbolici e testare il bersaglio. Ma nel mio caso, che non è un problema.

Mi auguro che può aiutare gli altri!

Altri suggerimenti

il seguente codice dovrebbe funzionare bene (originariamente postet da Peter Provost sulla PowerShell Codice 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;
       }

   }
}

Forse mi fraintendere le vostre domande, ma hardlinks non posso andare da un disco all'altro. Possono esistere solo su un singolo disco.

All'interno della Net Framwork non c'è alcun supporto per ottenere queste informazioni. Ma l'API Win32 in grado di fornire queste informazioni.

Date un'occhiata a questo articolo . Essa può aiutare.

Aggiorna

Per quanto ne so, non è possibile farlo tra le diverse unità. Punti di giunzione non sono sicuramente tuo amico perche 'funziona solo su Foldes. Ma dopo aver letto questo articolo di Wikipedia sembra che si può fare su Vista e Win7 con i link simbolici. C'è anche un link per questa estensione guscio che sembra coprire tutto ciò che si può fare con queste caratteristiche speciali NTFS. Forse con questo si può verificare se il tuo obiettivo è raggiungibile e forse successivamente controllare il MSDN per la funzione API Win32 desiderata.

provare:

using System.IO;

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

e ciclo tra le matrici, trovare i file e cambiare il nome

EDIT: Leggendo i commenti So che ho risposto prima di sapere che cosa è un collegamento reale. Ora mi rendo conto che questa risposta non aiuta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top