アプリでUSBドライブ監視時にUSBの抜去ができない。
Posted: 2012年5月22日(火) 12:07
先日に続き恐縮ですが、質問をさせてください。
アプリ側でUSBのファイル変更の監視を行っています。
この時に、タスクトレイの「ハードウェアを安全に取り外してメディアを取り出す」からUSBの取り外しを行うと、
「このデバイスは現在使用中です。・・・・・」というエラーが発生します。
USBドライブの監視を以下のサイトを参考にしています。
方法はドライブ単位にReadDirectoryChanges()を使用したファイルアクセスのチェックです。
http://d.hatena.ne.jp/seraphy/20120506
■質問
上記のWindowsのエラーを回避してUSBの抜去をすることは可能でしょうか?
こちらで検討したところ、常時CreateFileでオープンしているため、不可能だと思っています。
■調査範囲
一応原因は把握しており、CreateFileでドライブ自体をオープンしているため、OS側がUSBドライブを使用中と判断したためだと認識しています。
現状の実装はWindowのサービス上で実装しています。
USB挿入時のイベント(SERVICE_CONTROL_DEVICEEVENT)を取得後に、監視を開始。
抜去時のイベントでリソースの開放を行っています。
物理的にUSBを抜いた場合はSERVICE_CONTROL_DEVICEEVENTは発生しますが、上記の抜き方では発生しません。
・コードの一部記載します
HANDLE m_hDir = ::CreateFile(strDirToWatch, //USBドライブのパス
FILE_LIST_DIRECTORY,
FILE_SHARE_READ | FILE_SHARE_WRITE ,
NULL,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS |
FILE_FLAG_OVERLAPPED,
NULL);
-- 中略 --
BOOL b = ReadDirectoryChangesW(m_hDir, pBuf, nBufSize, TRUE, m_cOpt.dwWatchMode, 0, &m_Overlapped, 0);
if(!b) {
break;
}
-- 中略 --
ファイルアクセスがあったファイルのチェック
アプリ側でUSBのファイル変更の監視を行っています。
この時に、タスクトレイの「ハードウェアを安全に取り外してメディアを取り出す」からUSBの取り外しを行うと、
「このデバイスは現在使用中です。・・・・・」というエラーが発生します。
USBドライブの監視を以下のサイトを参考にしています。
方法はドライブ単位にReadDirectoryChanges()を使用したファイルアクセスのチェックです。
http://d.hatena.ne.jp/seraphy/20120506
■質問
上記のWindowsのエラーを回避してUSBの抜去をすることは可能でしょうか?
こちらで検討したところ、常時CreateFileでオープンしているため、不可能だと思っています。
■調査範囲
一応原因は把握しており、CreateFileでドライブ自体をオープンしているため、OS側がUSBドライブを使用中と判断したためだと認識しています。
現状の実装はWindowのサービス上で実装しています。
USB挿入時のイベント(SERVICE_CONTROL_DEVICEEVENT)を取得後に、監視を開始。
抜去時のイベントでリソースの開放を行っています。
物理的にUSBを抜いた場合はSERVICE_CONTROL_DEVICEEVENTは発生しますが、上記の抜き方では発生しません。
・コードの一部記載します
HANDLE m_hDir = ::CreateFile(strDirToWatch, //USBドライブのパス
FILE_LIST_DIRECTORY,
FILE_SHARE_READ | FILE_SHARE_WRITE ,
NULL,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS |
FILE_FLAG_OVERLAPPED,
NULL);
-- 中略 --
BOOL b = ReadDirectoryChangesW(m_hDir, pBuf, nBufSize, TRUE, m_cOpt.dwWatchMode, 0, &m_Overlapped, 0);
if(!b) {
break;
}
-- 中略 --
ファイルアクセスがあったファイルのチェック