#include <string> #include "windows.h" #include <fstream> #include <stdexcept> #include <iostream> using namespace std; class File_locker { HANDLE file_handle; static const int MAX_TRIES = 10; static const int SLEEP_INTERVAL = 500; public: File_locker(std::string filename) { // you can use GetLastError() to determine why the open failed, // but this is a demo, not production code for (int i = 0; i < MAX_TRIES; ++i) { file_handle = ::CreateFile(filename.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (file_handle != INVALID_HANDLE_VALUE) return; ::Sleep(SLEEP_INTERVAL); } throw std::runtime_error((std::string("unable to open file ") + filename).c_str()); } ~File_locker() { ::CloseHandle(file_handle); } }; int main(int argc, char ** argv) { try { File_locker fl(argv[1]); cout << "released"<<endl; return 0; } catch (std::runtime_error& ex) { cout << "can't open" << endl; return 1; } }
파일이 현재 다른 프로그램에 의해서 사용중인지 아닌지 판단할때
C/C++ 자체 만으론 구현이 불가능하다
OS자체의 api를 구현해야 하는데
LINUX에서는 예전에 포스팅을 했었다. http://ddiri01.tistory.com/69
윈도우에선 ::CreateFile 이라는 api를 사용하며
파일에 다른 프로그램이 접근 못하게 LOCK을 거는 함수인듯.
반응형
'Programming' 카테고리의 다른 글
[sql] 설치 없이 연습할 수 있는 싸이트 (0) | 2019.03.28 |
---|---|
[javascript, ajax] read and parse csv file on server (0) | 2018.04.10 |
MATLAB에서 socket 통신 (0) | 2014.02.27 |
matlab, nargin, nargout 주의점. (0) | 2014.01.22 |
qtCreator build error : error: explicit instantiation of ‘std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, const ... since updating to Mountain Lion (0) | 2013.05.27 |