监视文件路径

根据选择监视指定文件夹, 由于没有找到CVI是否有相关封装函数,因此调用的是WINDOWS API函数进行监视,简单界面设计如图:

STRING 为 路径显示控件,TEXTMSG_2为结果显示的第一行,TEXTMSG_3为结果显示的第二行。



#include <ansi_c.h>
#include "windows.h"
#include <utility.h>
#include <stdio.h>




#include <cvirte.h>		
#include <userint.h>
#include "monitor.h"

static int panelHandle;

static int run=0;

void monitorFile(HANDLE handle,char resultData[][1024]);
void delay(double time);


int main (int argc, char *argv[])
{
	if (InitCVIRTE (0, argv, 0) == 0)
		return -1;	/* out of memory */
	if ((panelHandle = LoadPanel (0, "monitor.uir", PANEL)) < 0)
		return -1;
	DisplayPanel (panelHandle);
	RunUserInterface ();
	DiscardPanel (panelHandle);
	return 0;
}

int CVICALLBACK panelCB (int panel, int event, void *callbackData,
						 int eventData1, int eventData2)
{
	switch (event)
	{
		case EVENT_CLOSE:
			QuitUserInterface (0);
			break;
		case EVENT_PANEL_MINIMIZE:

			break;
	}
	return 0;
}

int CVICALLBACK monitorDir (int panel, int control, int event,
							void *callbackData, int eventData1, int eventData2)
{
	char path[500]={0};
	switch (event)
	{
		case EVENT_COMMIT:
			DirSelectPopup ("c:\\Users\\Administrator\\Desktop", "Select Directory", 1, 1, path);
			SetCtrlVal(panelHandle,PANEL_STRING,path);
			break;
	}
	return 0;
}

int CVICALLBACK quit (int panel, int control, int event,
					  void *callbackData, int eventData1, int eventData2)
{
	switch (event)
	{
		case EVENT_COMMIT:
			run=0;
			break;
	}
	return 0;
}

int CVICALLBACK monitor (int panel, int control, int event,
						 void *callbackData, int eventData1, int eventData2)
{
	char path[500];
	char resultData[2][1024]={0};
	switch (event)
	{
		case EVENT_COMMIT:
			GetCtrlVal(panelHandle,PANEL_STRING,path);
			run=1;
			HANDLE handle = CreateFileA((LPCWSTR)path,  FILE_LIST_DIRECTORY,   FILE_SHARE_READ | FILE_SHARE_DELETE | FILE_SHARE_WRITE,
										NULL,  OPEN_EXISTING,  FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED,  NULL);
			monitorFile(handle,resultData);
			
			SetCtrlVal (panelHandle, PANEL_TEXTMSG_2, resultData[0]);
			SetCtrlVal (panelHandle, PANEL_TEXTMSG_3, resultData[1]);
			
			break;
	}
	return 0;
}


/*---------------------------------------------------------------------------
 *  实现功能:监控
 *-------------------------------------------------------------------------*/
void monitorFile(HANDLE handle,char resultData[][1024])
{
	char notify[1024] = {0};
	FILE_NOTIFY_INFORMATION *pnotify=(FILE_NOTIFY_INFORMATION *)notify;
	DWORD cbBytes;

//--------------------------------------------------------------------------------------------------------------	
	while(run == 1)
	{
		BOOL result = ReadDirectoryChangesW(handle, ¬ify, sizeof(notify), TRUE,
											FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_CREATION
											, &cbBytes, NULL, NULL);
		if(result)
		{
			if(pnotify->Action == FILE_ACTION_ADDED)
				strcpy(resultData[1],"add new file");
			else if(pnotify->Action == FILE_ACTION_REMOVED)
				strcpy(resultData[1],"delete file");
			else if(pnotify->Action == FILE_ACTION_MODIFIED)
				strcpy(resultData[1],"change file");
			WideCharToMultiByte(CP_ACP,0,pnotify->FileName,pnotify->FileNameLength/2,resultData[0],1024,NULL,NULL);
			if((pnotify->NextEntryOffset != 0) && (pnotify->FileNameLength) > 0 && (pnotify->FileNameLength < MAX_PATH))
			{
				PFILE_NOTIFY_INFORMATION p = (PFILE_NOTIFY_INFORMATION)((char*)pnotify+pnotify->NextEntryOffset);   
				WideCharToMultiByte(CP_ACP,0,p->FileName,p->FileNameLength/2,resultData[0],1024,NULL,NULL);
				strcpy(resultData[1],"change file name");
			}
			return ;
		}
		delay(1);
	}
//-------------------------------------------------------------------------------------------------------------------
}


void delay(double time)
{
	for(int i=0;i<time*100;i++)
	{
		Delay(0.01);
		ProcessDrawEvents();
		ProcessSystemEvents();
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值