È possibile aprire un file in un modo che consenta la successiva cancellazione/rinomina della sua cartella principale?Aprire il file senza (davvero) bloccarlo?
So che si può fare questo:
File.Open("foo.bar", FileMode.Open, FileAccess.Read, FileShare.Read | FileShare.Delete)
che consentirà il file da cancellare quando la maniglia file viene chiuso. Tuttavia, se non consente la cancellazione della cartella principale senza errori.
Non ho trovato nulla nel framework. Ho trascurato qualcosa, o c'è una API nativa a cui posso intervenire.
Nota: non mi interessa se ottengo un'eccezione quando si utilizza lo stream del file eliminato. In effetti sarebbe l'ideale.
UPDATE:
Così l'idea più promettente è stato il Hardlink, ma non riesco proprio a farlo funzionare. Ricordo ancora Access Denied quando provo a eliminare la directory principale. Ecco il mio codice:
class Program
{
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern bool CreateHardLink(string lpFileName, string lpExistingFileName, IntPtr lpSecurityAttributes);
static void Main(string[] args)
{
string hardLinkPath = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
string realPath = @"C:\foo\bar.txt";
if (CreateHardLink(hardLinkPath, realPath, IntPtr.Zero))
{
using (FileStream stream = File.Open(hardLinkPath, FileMode.Open, FileAccess.Read, FileShare.Delete | FileShare.ReadWrite))
{
Console.Write("File locked");
Console.ReadLine();
}
File.Delete(hardLinkPath);
}
else
Console.WriteLine("LastError:{0}", Marshal.GetLastWin32Error());
}
}
Suona come qualcosa che farei. Forse puoi copiare in memoria se il file è abbastanza piccolo? – strager
sì, lo stiamo facendo ora, ma ci sono molti file, e sono abbastanza grandi da 3Mb a 100Mb. Provoca un sacco di problemi con il GC. –