2016-11-30 74 views
0

每次我保存某个脚本文件时,我正在使用NotePad ++,我需要将更改上传到我们的服务器,以便我们可以将更改部署到各种机器。用于保存文件的Windows事件挂钩

我有时忘记在NotePad ++中重构我的代码后上传更改,我想知道是否有方法让我创建一个简单的应用程序,该应用程序将侦听“保存”事件并自动为我上传文件。

我目前在Windows操作系统上运行,并希望使用C++来做到这一点。我想探索Windows事件并可能绑定到事件挂钩来完成此操作。任何其他语言也会受到欢迎。

任何想法或建议?

这里是我的代码迄今遵循以下Josh的建议:

#include <windows.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <tchar.h> 

void RefreshDirectory(LPTSTR); 
void WatchDirectory(LPTSTR); 

void _tmain(int argc, TCHAR *argv[]) 
{ 
    if (argc != 2) 
    { 
     _tprintf(TEXT("Usage: %s <dir>\n"), argv[0]); 
     return; 
    } 

    WatchDirectory(argv[1]); 
} 

void WatchDirectory(LPTSTR lpDir) 
{ 
    DWORD dwWaitStatus; 
    HANDLE dwChangeHandles[2]; 
    TCHAR lpDrive[4]; 
    TCHAR lpFile[_MAX_FNAME]; 
    TCHAR lpExt[_MAX_EXT]; 

    _tsplitpath_s(lpDir, lpDrive, 4, NULL, 0, lpFile, _MAX_FNAME, lpExt, _MAX_EXT); 

    lpDrive[2] = (TCHAR)'\\'; 
    lpDrive[3] = (TCHAR)'\0'; 

    // Watch the directory for file creation and deletion. 

    dwChangeHandles[0] = FindFirstChangeNotification(
     lpDir,       // directory to watch 
     FALSE,       // do not watch subtree 
     FILE_NOTIFY_CHANGE_LAST_WRITE); // watch file name changes 

    if (dwChangeHandles[0] == INVALID_HANDLE_VALUE) 
    { 
     printf("\n ERROR: FindFirstChangeNotification function failed.\n"); 
     ExitProcess(GetLastError()); 
    } 

    // Make a final validation check on our handles. 

    if ((dwChangeHandles[0] == NULL)) 
    { 
     printf("\n ERROR: Unexpected NULL from FindFirstChangeNotification.\n"); 
     ExitProcess(GetLastError()); 
    } 

    // Change notification is set. Now wait on both notification 
    // handles and refresh accordingly. 

    while (TRUE) 
    { 
     // Wait for notification. 

     printf("\nWaiting for notification...\n"); 

     // Waits until the specified object is in the signaled state or 
     // the time-out interval elapses. 
     // Because our second parameter is set to INFINITE, the function will 
     // return only when the object is signaled. 
     dwWaitStatus = WaitForSingleObject(dwChangeHandles, INFINITE); 

     switch (dwWaitStatus) 
     { 
      // Our return value, WAIT_OBJECT_0 signifies that the first object 
      // signaled the event. 
      case WAIT_OBJECT_0: 

       // A file was created, renamed, or deleted in the directory. 
       // Refresh this directory and restart the notification. 

       RefreshDirectory(lpDir); 
       if (FindNextChangeNotification(dwChangeHandles[0]) == FALSE) 
       { 
        printf("\n ERROR: FindNextChangeNotification function failed.\n"); 
        ExitProcess(GetLastError()); 
       } 
       break; 

      case WAIT_TIMEOUT: 

       // A timeout occurred, this would happen if some value other 
       // than INFINITE is used in the Wait call and no changes occur. 
       // In a single-threaded environment you might not want an 
       // INFINITE wait. 

       printf("\nNo changes in the timeout period.\n"); 
       break; 

      default: 
       printf("\n ERROR: Unhandled dwWaitStatus.\n"); 
       ExitProcess(GetLastError()); 
       break; 
     } 
    } 
} 

void RefreshDirectory(LPTSTR lpDir) 
{ 
    // This is where you might place code to refresh your 
    // directory listing, but not the subtree because it 
    // would not be necessary. 

    _tprintf(TEXT("Directory (%s) changed.\n"), lpDir); 
} 

回答

1

您可以监视使用FindFirstChangeNotification变化的文件系统。当你调用这个函数时,你会得到一个HANDLE。您可以使用WaitSingleObject(或类似)等待该句柄。当等待返回时,您可以使用ReadDirectoryChanges来确定发生了什么。如果发生任何事情匹配某个事件或更改您关心的文件,则可以采取适当的措施...否则将忽略该事件。

因为你会等待(并因此阻塞线程),所以如果你希望你的程序在做其他事情,你可能需要在工作线程上执行这个工作。

一个简单的启动方法可能是使用FILE_NOTIFY_CHANGE_LAST_WRITE过滤器来监听事件;当被监控目录中的文件被写入时,这将释放您的等待。

请注意,并非所有程序都以相同方式保存文件;一些打开现有文件并写入,另一些则删除并替换,或者一些组合(首先写入临时文件,然后与原始文件交换)。因此,它可能并不像直接等待上次写入通知那样简单,以完成您正在处理的内容。

+0

嘿@Josh,我一直在使用这种方法到目前为止,它一直致力于伟大的!通过使用FindFirstChangeNotification,我能够检测上次文件被修改的时间。我想知道是否可以向我提供一些关于如何使用ReadDirectoryChanges函数的说明。在网上查找不同的文章已被证明是徒劳的。迄今为止,我在我的原始发布中写了我的代码。再次感谢! –

1

想想写一个NP ++插件吧。

只要使用NPPN_FILESAVEDNPPN_FILEBEFORESAVE保存或即将保存文件,您就可以注册插件。

请看看这个链接:

http://docs.notepad-plus-plus.org/index.php/Messages_And_Notifications

+0

肯定也会考虑到这一点。这个选项还能让我探索Windows事件并通过C/C++获得更多的练习吗? –

+0

不,这是npp特定的。 – root