본문 바로가기
Programming

check the file is used by another process or not [windows]

by 단창 2014. 3. 13.
#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을 거는 함수인듯.

 

 

반응형