क्या एक फ़ाइल को इस तरह से खोलना संभव है जिससे उसके मूल फ़ोल्डर को बाद में हटाने/नामांकन की अनुमति मिल सके?बिना खुले फ़ाइल (वास्तव में) इसे लॉक कर रहा है?
मैं जानता हूँ कि आप यह कर सकते हैं: जब फ़ाइल हैंडल बंद कर दिया है
File.Open("foo.bar", FileMode.Open, FileAccess.Read, FileShare.Read | FileShare.Delete)
किन फ़ाइल के लिए अनुमति देगा हटाए जाने के लिए। हालांकि, अगर यह त्रुटि के बिना मूल फ़ोल्डर को हटाने की अनुमति नहीं देता है।
मुझे ढांचे में कुछ भी नहीं मिला। क्या मैंने कुछ अनदेखा किया है, या कोई मूल एपीआई है जिसे मैं इंटरऑप कर सकता हूं।
नोट: मुझे हटाया नहीं गया है कि हटाए गए फ़ाइल की स्ट्रीम का उपयोग करते समय मुझे अपवाद मिलता है। वास्तव में यह आदर्श होगा।
अद्यतन:
तो सबसे होनहार विचार Hardlink था, हालांकि मैं सिर्फ यह काम नहीं कर सकता। जब भी मैं मूल निर्देशिका को हटाने का प्रयास करता हूं तब भी मैं एक्सेस अस्वीकृत हो जाता हूं। यहां मेरा कोड है:
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());
}
}
ऐसा कुछ लगता है जो मैं करता हूं। यदि फ़ाइल पर्याप्त छोटा है तो हो सकता है कि आप स्मृति में प्रतिलिपि बना सकें? – strager
हाँ, हम अब ऐसा कर रहे हैं, लेकिन बहुत सारी फाइलें हैं, और वे काफी बड़े हैं 3 एमबी से 100 एमबी। यह बहुत सी जीसी थ्रैशिंग का कारण बनता है। –