2012-10-11 117 views
3

我想知道如果一個文件是由用戶打開閱讀(雙擊或打開...),我編寫了一個C++應用程序與Windows上的Qt Creator,經過一些研究後,我發現QFileSystemWatche,但它讓我只有在特定文件夾中發生更改時才知道。如何知道文件已打開? QT

空隙QFileSystemWatcher :: fileChanged(常量的QString &路徑)[信號] 當在指定的路徑中的文件是 修改,重命名或從磁盤去除這個信號被髮射。

如何知道文件是否打開?或者有沒有辦法修改文件打開或關閉時?

任何想法請!!!

+0

看來,你不能在這裏看到爲什麼:http://lists.trolltech.com/qt-interest/2006-01/msg00251.html – tune2fs

+0

@ tune2fs我的目的就是要知道一個文件是在用戶點擊還是在程序中打開的時候打開的,有些如何將它打開的信號連接到一個插槽,我希望這更清楚。 – Oumaya

+0

「文件被打開」的問題沒有明確定義;例如,如果文件駐留在共享驅動器(NAS存儲)上,而另一臺遠程計算機訪問該文件,則無法獲得通知,因爲沒有聯網的文件系統具有服務器推送的回調功能。另外,如果有人打開文件並立即關閉文件,通知你是否正確?通常...這是您可以通過系統跟蹤/調試實用程序(SysInternals procmon/filemon)僅提取的信息 - 出於某種原因。 –

回答

0

2解決方案:

  • 使用Qt

您可以進行下面的函數(僞):

function is_open(file) 
    handle = open file to write 
    if(handle is ok) 
     close file 
     return true 
    else 
     return false 

然後你每秒一次調用它,並放出一個信號fileOpened(const QString& file)每當is_open(t-1) == false && is_open(t) == true,其中t是時間。

但是,此解決方案可能會很慢,並且可能會導致一些io訪問膨脹,尤其是如果該文件位於遠程服務器上。它也可能導致磁盤/ SSD過早磨損,所以我不推薦這種解決方案。

  • 使用系統API

你可以得到所有突未的所有文件句柄的列表,然後檢查是否包含句柄要監視的文件。再一次,你將不得不每秒做x次。它會減慢你的電腦;它在實踐中並不真正可移植(代碼需要嚴重依賴於特定於系統的API),並且可能需要提高權限才能工作。我不建議太...

+0

感謝@Synxis爲您提供的解決方案,但我認爲它很難接受它,正如您所說可能會減慢我的電腦速度,並且我希望有一個最佳解決方案,讓我知道用戶是否單擊某個文件以打開它或嘗試進行嘗試打開它並從磁盤讀取數據,謝謝你:) – Oumaya

+0

順便說一句,我所知道的唯一快速解決方案是編寫一個文件系統驅動程序,這比你想要的功能更有效。 – Synxis

+0

是的,你是完全正確的,我有創建一個文件系統驅動程序或過濾系統驅動程序的想法,但我是新手,時間緊迫,我對WDK一無所知,所以我要求簡單的方法來做那。 – Oumaya

相關問題