ファイルからの書き込み/読み取りがあり、アプリケーションの他のインスタンスのファイルをロックしたいとします。どのように私はそれを行うことができます(C + +ビジュアルスタジオ2003)? 私は_locking()を使ってみましたが、同じインスタンスで読み書きしようとすると自分自身がファイルにアクセスできませんでした。 LockFile()のオプションはありますが、正しく設定する方法はわかりません。 私を助けてください。Windows上でC++を使用してファイルをロックする
4
A
答えて
11
Win32 API CreateFileを使用し、共有権を指定しないでください。これにより、他のプロセスがそのファイルにアクセスすることができなくなります。
dwShareMode DWORDは、共有の種類を指定します(例:GENERIC_READ)。 0を指定すると、共有権を付与する必要がないことを意味します。
例:
HANDLE hFile = CreateFile(_T("c:\\file.txt"), GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
あなただけがLockFileやLockFileExを使用することができ、ファイルの特定の部分をロックします。
例:
//Lock the first 1024 bytes
BOOL bLocked = LockFile(hFile, 0, 0, 1024, 0);
1
LockFileEx()(排他ロック)が必要です。 CおよびC++用のSecure Programming Cookbookのthis discussionをご覧ください。
1
オンラインでしばらく検索したところ、良い例は見つかりませんでした。
ここでは、プロセスの存続期間中にファイルをロックする目的でCreateFileを呼び出す方法を2つ紹介します。これは、グローバル名前付きミューテックスにCreateMutexを使用するCLimitSingleInstanceの面に沿って使用します。
CreateFileへの最初の呼び出しでは開こうとしますが、2番目の呼び出しでは必要に応じて作成されます。 私はもう少し徹底した実装をしています。 Qtで実装したので、std :: coutの代わりにqCritical()を使用し、代わりにQDir :: tempPath()を実装しました。ここで
class SingleInstance
{
protected:
DWORD m_dwLastError;
HANDLE m_hFile;
public:
SingleInstance(const char *strMutexName) { }
bool attemptToLockTempFile()
{
QString lockFile = QDir::tempPath() + "/My.exe.lock";
m_hFile = CreateFileA(lockFile.toLocal8Bit().data(), GENERIC_READ, 0,
NULL, OPEN_EXISTING, 0, NULL);
DWORD dwLastError = GetLastError();
if(m_hFile != NULL && m_hFile != INVALID_HANDLE_VALUE)
{
return true;
}
else
{
if(dwLastError == ERROR_FILE_NOT_FOUND)
{
m_hFile = CreateFileA(lockFile.toLocal8Bit().data(), GENERIC_READ,
0, NULL, CREATE_NEW, 0, NULL);
dwLastError = GetLastError();
if(m_hFile != NULL && m_hFile != INVALID_HANDLE_VALUE)
{
return true;
}
else if(dwLastError == ERROR_SHARING_VIOLATION)
{
qCritical() << "Sharing Violation on My.exe.lock";
}
else
{
qCritical() << "Error reading" << "My.exe.lock" << "-" << dwLastError;
}
}
else if(dwLastError == ERROR_SHARING_VIOLATION)
{
qCritical() << "Sharing Violation on My.exe.lock";
}
else
{
qCritical() << "Unable to obtain file lock -" << dwLastError;
}
return false;
}
}
~SingleInstance()
{
if (m_hFile != NULL && m_hFile != INVALID_HANDLE_VALUE)
{
::CloseHandle(m_hFile); //Do as late as possible.
m_hFile = NULL;
}
}
}
はあなたの主な機能のトップに持っているだろうかです:私はのCreateFile()が、まだそれを試してみましたfstreamの/ファイルを使用しているとき、私は*ファイルへのハンドルを取得するにはどうすればよい
SingleInstance g_SingleInstanceObj(globalId_QA);
// Makes sure that the program doesn't run if there is another
// instance already running
if (g_SingleInstanceObj.IsAnotherInstanceRunning())
{
return 0;
}
関連する問題
- 1. WM6.1上のC++ロックtabskbarとwindowsロックも
- 2. Windows上でのビデオオーバーレイ(C#?を使用)
- 3. C++/C#を使用してWindows Mobile上でファイルを圧縮する可能な方法
- 4. C++を使用してWindows上でイベントビューアにログ
- 5. C#を使用してWindows上でウイルス対策ソフトウェアを検出する
- 6. Windows上でApache Tomcatを使用してjspファイルを実行する
- 7. C#を使用してWindowsサービス(C#で記述)を使用
- 8. ApacheサーバとTortoiseSVNを使用してファイルをロックする
- 9. DirectXを使用してWindows上で画面をキャプチャする
- 10. Pythonを使用してWindows上で「送信」を変更する
- 11. Windows Mobile上でIImageインターフェイスを使用してBITMAPをConvertする
- 12. Windows上のcプログラムでpcreを使用する
- 13. C#コーディングを使用してWindowsサーバー上の負荷をチェックする方法は?
- 14. C++を使用したWindows上でのSymbianプログラミング -
- 15. ローカルFS上のファイルをロックする
- 16. Windows上でVisual StudioなしでQtでインテル®C++コンパイラー(Composer)2011を使用する
- 17. Windows上でnode.jsを使用してWebサイトを削る
- 18. HIPHOP-PHPを使用してコンパイルされたWindows上でファイルを実行
- 19. Windows上でwxPythonを使用してBMPファイルを読み込む方法は?
- 20. Windowsサービスを使用してC#またはVB.netを使用してCSVファイルを作成、更新、削除する
- 21. C++でWindows 7 APIを使用してランプロセスを取得する
- 22. Gnustepを使用してWindows環境でObjective-Cをプログラミングする
- 23. CでWindowsアプリケーションを使用してhttpメソッドを実行する#
- 24. WindowsでC++ Builderを使用してMySQLをコンパイルする
- 25. Monoを使用してWindowsでMac .appファイルを構築する
- 26. C#を使用してWindowsスケジュールタスクにアクセス
- 27. C#Windowsフォームアプリケーションを使用してExcelデータベーステーブルにExcelファイルをアップロードする方法
- 28. Visual C++(Windows)を使用してファイル/フォルダをどこから移動するか?
- 29. Syntote NASを使用してWindows上で短縮されたファイル名
- 30. PHPを使用してSelenium WebDriver上でファイルをアップロードする
この事実にも縛られていますか? –
ハンドルをcreatefileからfstreamに変換する方法はありますか? –
@Sofsr:この質問を見てください:http://stackoverflow.com/questions/839856/using-stdfstream-how-to-deny-access-read-and-write-to-the-file – Casebash