2013-02-11 27 views
7

लॉक की गई फ़ाइल के बारे में अधिक जानकारी प्राप्त करने के लिए नीचे उल्लिखित दृष्टिकोण का उपयोग करने का प्रयास कर रहा है।जांच कर रहा है कि फ़ाइल उपयोग में है या किस एप्लिकेशन से?

Is file in use

function GetFileInUseInfo(const FileName : WideString) : IFileIsInUse; 
var 
    ROT : IRunningObjectTable; 
    mFile, enumIndex, Prefix : IMoniker; 
    enumMoniker : IEnumMoniker; 
    MonikerType : LongInt; 
    unkInt : IInterface; 
begin 
    result := nil; 

    OleCheck(GetRunningObjectTable(0, ROT)); 
    OleCheck(CreateFileMoniker(PWideChar(FileName), mFile)); 

    OleCheck(ROT.EnumRunning(enumMoniker)); 

    while (enumMoniker.Next(1, enumIndex, nil) = S_OK) do 
    begin 
    OleCheck(enumIndex.IsSystemMoniker(MonikerType)); 
    if MonikerType = MKSYS_FILEMONIKER then 
    begin 
     if Succeeded(mFile.CommonPrefixWith(enumIndex, Prefix)) and 
     (mFile.IsEqual(Prefix) = S_OK) then 
     begin 
     if Succeeded(ROT.GetObject(enumIndex, unkInt)) then 
     begin 
      if Succeeded(unkInt.QueryInterface(IID_IFileIsInUse, result)) then 
      begin 
      result := unkInt as IFileIsInUse; 
      exit; 
      end; 
     end; 
     end; 
    end; 
    end; 
end; 

लेकिन

unkInt.QueryInterface(IID_IFileIsInUse, result) 

करने के लिए कॉल हमेशा E_NOINTERFACE देता है।

प्लेटफ़ॉर्म: विंडोज 7 32 बिट-ओएस, शब्द फ़ाइलों और .msg फ़ाइलों को खोलना।

एक्सप्लोरर से खोलने वाली फ़ाइलों की जांच की गई और हटाने की कोशिश की गई। यह उस एप्लिकेशन के बारे में उचित विवरण दिखाता है जिसमें फ़ाइल खोला जाता है। मेरे आवेदन में, मैं उस एप्लिकेशन के बारे में जानकारी प्रदर्शित करने का प्रयास कर रहा हूं जिसमें फ़ाइल खोली गई है। लेकिन पॉइंटर को IFileIsInUse इंटरफ़ेस पर डालने का प्रयास करते समय, QueryInterface कॉल रिटर्न कोड E_NOINTERFACE के साथ विफल रहता है जिसका अर्थ है कि आरओटी में ऑब्जेक्ट IFileIsInUse लागू नहीं करता है। AFASIK, एमएस ऑफिस फाइलें IFileIsInUse

कोई विचार क्या गलत है?

+0

http://stackoverflow.com/questions/2479733/file-locked-by-which-process पर समान सवाल, लेकिन .NET के लिए। अपने स्वयं के प्रश्न का उत्तर देने में मदद हो सकती है। –

उत्तर

7

वास्तव में आपका कोड ठीक काम करता है। समस्या यह है कि जिन प्रोग्रामों का आप परीक्षण कर रहे हैं वे वास्तव में IFileIsInUse लागू नहीं करते हैं। जब सिस्टम E_NOINTERFACE देता है तो यह सटीक है। इंटरफ़ेस लागू नहीं किया गया है।

मैंने इसे File Is In Use Sample from the SDK के साथ परीक्षण किया। उस एप्लिकेशन द्वारा आरओटी में जोड़े गए फ़ाइलें, जो IFileIsInUse को लागू करती हैं, को आपके कोड द्वारा उठाया गया था। दूसरी तरफ, एक्रोबैट 8 और वर्ड 2010 द्वारा खोले गए फाइल नहीं थे।

निष्कर्ष जो मैं इस से आकर्षित करता हूं वह यह है कि IFileIsInUse सिद्धांत में एक अच्छा विचार है, लेकिन यदि अनुप्रयोग इसका समर्थन नहीं करते हैं तो अधिक उपयोग नहीं करते हैं। और ऐसा प्रतीत होता है कि ऐसे प्रमुख अनुप्रयोग हैं जो नहीं करते हैं।

यह स्पष्ट है कि आपको यह पता लगाने के लिए एक या अधिक अन्य तंत्रों का उपयोग करने की आवश्यकता होगी कि IFileIsInUse लागू नहीं होने पर कौन सा एप्लिकेशन लॉक हो गया है।

+0

@Pavan क्या यह मदद मिली? –

+0

हां। धन्यवाद। जब ऑब्जेक्ट IFileIsInUse लागू नहीं करता है तो डेटा लाने के लिए फ़ॉलबैक दृष्टिकोण का उपयोग किया जाता है। – Pavan