2013-02-11 46 views
7

Cố gắng sử dụng phương pháp được đề cập dưới đây để biết thêm chi tiết về tệp bị khóa.Kiểm tra xem tệp có đang được sử dụng hay ứng dụng nào không?

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; 

Nhưng cuộc gọi đến

unkInt.QueryInterface(IID_IFileIsInUse, result) 

luôn trả E_NOINTERFACE.

Nền tảng: Windows 7 32 bit-OS, mở tệp từ và tệp .msg.

Đã kiểm tra các tệp mở từ trình khám phá và cố gắng xóa. Nó hiển thị chi tiết thích hợp về ứng dụng trong đó tệp được mở. Trong ứng dụng của tôi, tôi cố gắng hiển thị thông tin về ứng dụng trong đó tệp được mở. Nhưng khi cố gắng đưa con trỏ đến giao diện IFileIsInUse, các cuộc gọi QueryInterface không thành công với mã trả về E_NOINTERFACE có nghĩa là đối tượng trong ROT không thực hiện IFileIsInUse. Tệp AFASIK, MS Office triển khai IFileIsInUse

Bất kỳ ý tưởng nào là sai ở đây?

+0

Câu hỏi tương tự tại http://stackoverflow.com/questions/2479733/file-locked-by-which-process, nhưng đối với .NET. Có thể là một trợ giúp trong việc trả lời câu hỏi của riêng bạn. –

Trả lời

7

Thực tế, mã của bạn hoạt động tốt. Vấn đề là các chương trình bạn đang thử nghiệm thực sự không thực hiện IFileIsInUse. Khi hệ thống trả về E_NOINTERFACE, nó chính xác. Giao diện không được triển khai.

Tôi đã thử nghiệm điều này với File Is In Use Sample from the SDK. Các tệp được thêm vào ROT bởi ứng dụng đó, thực hiện IFileIsInUse, được chọn bởi mã của bạn. Mặt khác, các tệp được mở bởi Acrobat 8 ​​và Word 2010 thì không.

Kết luận mà tôi rút ra từ điều này là IFileIsInUse là một ý tưởng tốt về nguyên tắc, nhưng không sử dụng nhiều nếu các ứng dụng không hỗ trợ nó. Và có vẻ như có những ứng dụng chính không có.

Rõ ràng là bạn sẽ cần phải sử dụng một hoặc nhiều cơ chế khác để phát hiện ứng dụng nào có tệp bị khóa khi bạn thấy rằng IFileIsInUse không được triển khai.

+0

@Pavan Trợ giúp này có hữu ích không? –

+0

Có. Cảm ơn bạn. Một phương pháp dự phòng được sử dụng để lấy dữ liệu khi đối tượng không thực hiện IFileIsInUse. – Pavan

Các vấn đề liên quan