ファイルからの書き込み/読み取りがあり、アプリケーションの他のインスタンスのファイルをロックしたいとします。どのように私はそれを行うことができます(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. Puppetを使用してWindows上でhostsファイルを管理する
- 3. Windows上でvimを使用して.sqlファイルを解析する
- 4. Windowsライブラリを使用してlinux上のcppファイルをコンパイルする
- 5. Windows上でのビデオオーバーレイ(C#?を使用)
- 6. Windows 10をC#(UWP&SDK)でロックする
- 7. C++/C#を使用してWindows Mobile上でファイルを圧縮する可能な方法
- 8. C++を使用してWindows上でイベントビューアにログ
- 9. DLLでC#を使用してオブジェクトをロックする方法
- 10. C#WindowsフォームでOpenFileDialogを使用してExcelファイルを開く
- 11. C#を使用してWindows上でウイルス対策ソフトウェアを検出する
- 12. C#を使用してWindowsサービス(C#で記述)を使用
- 13. Windows上でnode.jsを使用してJavaScriptファイルを実行する方法(scribbletune)
- 14. Windows上でApache Tomcatを使用してjspファイルを実行する
- 15. Linux上でpyinstallerを使用してWindows実行ファイルを生成するには?
- 16. gstreamerパイプラインを使用してWindows上でmp4ファイルを再生する
- 17. PHPを使用してWindowsサーバー上のファイルをコピー
- 18. Windows上のcプログラムでpcreを使用する
- 19. .htpasswdを使用して.userファイルをロックする
- 20. ApacheサーバとTortoiseSVNを使用してファイルをロックする
- 21. Windows Mobile上でIImageインターフェイスを使用してBITMAPをConvertする
- 22. Windows上でPipを使用してNumPyをインストールする
- 23. msys2を使用してWindows上でopenssl-1.1.0eをコンパイルする
- 24. Windows上でAntを使用してPDFビューアを作成する
- 25. DirectXを使用してWindows上で画面をキャプチャする
- 26. Pythonを使用してWindows上で「送信」を変更する
- 27. C#コーディングを使用してWindowsサーバー上の負荷をチェックする方法は?
- 28. C++を使用したWindows上でのSymbianプログラミング -
- 29. .NETコア2.0を使用してWindows上のファイルの変更を監視する
- 30. Windows上でBashを使用するGitlab
この事実にも縛られていますか? –
ハンドルをcreatefileからfstreamに変換する方法はありますか? –
@Sofsr:この質問を見てください:http://stackoverflow.com/questions/839856/using-stdfstream-how-to-deny-access-read-and-write-to-the-file – Casebash