한국어
오픈소스포럼
 이곳은 다양한 오픈소스 프로젝트를 소개하고 리뷰, 활용 방법을 공유합니다.

시작하기 전에 다음 도구가 설치되어 있어야 한다.

  • Microsoft Visual Studio C++ build tools 또는 Visual Studio
  • QtCreator
  • CMake
  • Git

vcpkg 설치

Step 1: Clone the vcpkg repo

git clone https://github.com/Microsoft/vcpkg.git

Step 2: Run the bootstrap script to build vcpkg

.\vcpkg\bootstrap-vcpkg.bat

POCO 설치

vcpkg install POCO

기본적으로 x86 라이브러리가 설치된다. x64용을 설치하려면 다음 명령줄 처럼 사용한다.

vcpkg install [package name]:x64-windows

QtCreator에서 CMake 프로젝트 생성 및 구성

외부 IDE 에서 CMake와 함께 vcpkg를 사용하려면 툴체인 파일을 사용한다. 툴체인 파일 경로를 CMAKE_TOOLCHAIN_FILE 변수에 설정한다.

qtcreator_cmake.png

CMake 프로젝트 생성

CMakeLists.txt

cmake_minimum_required(VERSION 3.5)

project(helloworld LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# this is heuristically generated, and may not be correct
find_package(Poco CONFIG REQUIRED Net XML Zip Data Util)

add_executable(helloworld
    main.cpp
)

target_link_libraries(helloworld PRIVATE Poco::Net Poco::XML Poco::Zip Poco::Data Poco::Util)

main.cpp

#include "Poco/DirectoryWatcher.h"
#include "Poco/Delegate.h"
#include "Poco/FileStream.h"
#include "Poco/Path.h"

#include <iostream>

#define DEBUG(msg) std::cout << msg << std::endl;

class Monitor {
public:
    ~Monitor(){}

    void onItemAdded(const Poco::DirectoryWatcher::DirectoryEvent& ev);
    void onItemRemoved(const Poco::DirectoryWatcher::DirectoryEvent& ev);
    void onItemModified(const Poco::DirectoryWatcher::DirectoryEvent& ev);
    void onItemMovedFrom(const Poco::DirectoryWatcher::DirectoryEvent& ev);
    void onItemMovedTo(const Poco::DirectoryWatcher::DirectoryEvent& ev);
};

void Monitor::onItemAdded(const Poco::DirectoryWatcher::DirectoryEvent& ev)
{
    DEBUG("Added: " << ev.item.path())
}

void Monitor::onItemRemoved(const Poco::DirectoryWatcher::DirectoryEvent& ev)
{
    DEBUG("Removed: " << ev.item.path())
}

void Monitor::onItemModified(const Poco::DirectoryWatcher::DirectoryEvent& ev)
{
    DEBUG("Modified: " << ev.item.path())
}

void Monitor::onItemMovedFrom(const Poco::DirectoryWatcher::DirectoryEvent& ev)
{
    DEBUG("MovedFrom: " << ev.item.path())
}

void Monitor::onItemMovedTo(const Poco::DirectoryWatcher::DirectoryEvent& ev)
{
    DEBUG("MovedTo: " << ev.item.path())
}

Poco::Path path()
{
    Poco::Path p(Poco::Path::current());
    p.pushDirectory(".");
    return p;
}

int main(int argc, char *argv[])
{
    try{
        Poco::Path p(path());
        p.setFileName("test.txt");
        Poco::FileOutputStream fos(p.toString());
        fos << "Hello, world!";
        fos.close();

        Poco::DirectoryWatcher dw(path().toString(), Poco::DirectoryWatcher::DW_FILTER_ENABLE_ALL, 2);

        Monitor monitor;

        dw.itemAdded += Poco::delegate(&monitor, &Monitor::onItemAdded);
        dw.itemRemoved += Poco::delegate(&monitor, &Monitor::onItemRemoved);
        dw.itemModified += Poco::delegate(&monitor, &Monitor::onItemModified);
        dw.itemMovedFrom += Poco::delegate(&monitor, &Monitor::onItemMovedFrom);
        dw.itemMovedTo += Poco::delegate(&monitor, &Monitor::onItemMovedTo);

        Poco::Thread::sleep(1000);

        Poco::FileOutputStream fos2(p.toString(), std::ios::app);
        fos2 << "Again!";
        fos2.close();

        // loop
        while(1)
            Poco::Thread::sleep(2000 * dw.scanInterval());

    }catch (const Poco::Exception &ex){
        DEBUG(ex.what())
    }
}