求 “.TXT文本文档”C++源代码 要API源代码,不要MFC的。谢谢!或者别的文字处理程序源代码也可以。
展开全部
首先,说一下Ansi与Unicode的区别,Unicode版本的txt文件前两个字节为0xfeff,下面是我以前写的一个小程序。
当我们安装一个程序或运行一个程序时,我们想要知道这个程序做了些什么,为了了解一个程序会在硬盘上更改或安装哪些文件,我写了一个小程序。这个小程序很简单,只是调用了ReadDirectoryChangesW函数,这个函数是微软系统自带的。
#include<iostream>#include<Windows.h>#include<tchar.h>using namespace std;void main(int argc, TCHAR* argv[]){if(argc!=2) return; LPWSTR *szArgList; int argCount; szArgList = CommandLineToArgvW(GetCommandLine(), &argCount);TCHAR filename[MAX_PATH];wcscpy(filename,szArgList[1]);HANDLE hFile; HANDLE hFileMapping; LPVOID pbFile; int size; hFile=CreateFile(L"C:\\filesystemchangeinfo.txt",GENERIC_READ | GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);hFileMapping=CreateFileMapping(hFile,NULL,PAGE_READWRITE,0,sizeof(char)*2048*1024,NULL);//2MBpbFile=MapViewOfFile(hFileMapping,FILE_MAP_WRITE,0,0,NULL);DWORD drives=GetLogicalDrives();HANDLE hdir=CreateFile(filename,FILE_LIST_DIRECTORY,FILE_SHARE_READ | FILE_SHARE_DELETE | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_FLAG_BACKUP_SEMANTICS,NULL);if(hdir==INVALID_HANDLE_VALUE)cout<<"error";LPVOID lpBuffer=new TCHAR[500];DWORD ret;TCHAR str[50];TCHAR *p=(TCHAR*)pbFile;p[0]=0xfeff;p++;int x;int n;x=wcslen(filename);while(1){ReadDirectoryChangesW(hdir,lpBuffer,500*sizeof(TCHAR),TRUE,FILE_NOTIFY_CHANGE_FILE_NAME + FILE_NOTIFY_CHANGE_DIR_NAME + FILE_NOTIFY_CHANGE_ATTRIBUTES +FILE_NOTIFY_CHANGE_SIZE + FILE_NOTIFY_CHANGE_LAST_WRITE + FILE_NOTIFY_CHANGE_LAST_ACCESS + FILE_NOTIFY_CHANGE_CREATION + FILE_NOTIFY_CHANGE_SECURITY,&ret,NULL,NULL);if((((FILE_NOTIFY_INFORMATION*)lpBuffer)->FileNameLength)!=NULL){switch(((FILE_NOTIFY_INFORMATION*)lpBuffer)->Action){case FILE_ACTION_ADDED:{n=wcslen(L"添加文件: ");wcsncpy(p,L"添加文件: ",n);p+=n;}break;case FILE_ACTION_REMOVED:{n=wcslen(L"删除文件: ");wcsncpy(p,L"删除文件: ",n);p+=n;}break;case FILE_ACTION_MODIFIED:{n=wcslen(L"修改文件: ");wcsncpy(p,L"修改文件: ",n);p+=n;}break;case FILE_ACTION_RENAMED_OLD_NAME:{n=wcslen(L"重命名(旧名字): ");wcsncpy(p,L"重命名(旧名字): ",n);p+=n;}break;case FILE_ACTION_RENAMED_NEW_NAME:{n=wcslen(L"重命名(新名字): ");wcsncpy(p,L"重命名(新名字): ",n);p+=n;}break;default:{n=wcslen(L"不知道的行为: ");wcsncpy(p,L"不知道的行为: ",n);p+=n;}}wcsncpy(p,filename,x);p+=x;wcsncpy(p,(TCHAR*)((int)lpBuffer+12),(((FILE_NOTIFY_INFORMATION*)lpBuffer)->FileNameLength)/2);p+=(((FILE_NOTIFY_INFORMATION*)lpBuffer)->FileNameLength)/2;p[0]=0xd; p[1]=0xa; p+=2;}}}
其中,ReadDirectoryChangesW函数的第5个参数可以是许多值的和,这此可能值为:FILE_NOTIFY_CHANGE_FILE_NAME0x00000001、FILE_NOTIFY_CHANGE_DIR_NAME 0X00000002、FILE_NOTIFY_CHANGE_ATTRIBUTES0x00000004、FILE_NOTIFY_CHANGE_SIZE 0x00000008、FILE_NOTIFY_CHANGE_LAST_WRITE0x00000010、FILE_NOTIFY_CHANGE_LAST_ACCESS 0x00000020、FILE_NOTIFY_CHANGE_CREATION0x00000040、FILE_NOTIFY_CHANGE_SECURITY 0x00000100。关于这个函数的用法,参见VC++ SDK中的说明。运行这个程序的方法为:把要监视的文件夹拖到这个程序上,然后再做别的事,完了会在C盘生成名为filesystemchangeinfo.txt的文本文件,记录在监视的文件夹里发生的文件变动。
当我们安装一个程序或运行一个程序时,我们想要知道这个程序做了些什么,为了了解一个程序会在硬盘上更改或安装哪些文件,我写了一个小程序。这个小程序很简单,只是调用了ReadDirectoryChangesW函数,这个函数是微软系统自带的。
#include<iostream>#include<Windows.h>#include<tchar.h>using namespace std;void main(int argc, TCHAR* argv[]){if(argc!=2) return; LPWSTR *szArgList; int argCount; szArgList = CommandLineToArgvW(GetCommandLine(), &argCount);TCHAR filename[MAX_PATH];wcscpy(filename,szArgList[1]);HANDLE hFile; HANDLE hFileMapping; LPVOID pbFile; int size; hFile=CreateFile(L"C:\\filesystemchangeinfo.txt",GENERIC_READ | GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);hFileMapping=CreateFileMapping(hFile,NULL,PAGE_READWRITE,0,sizeof(char)*2048*1024,NULL);//2MBpbFile=MapViewOfFile(hFileMapping,FILE_MAP_WRITE,0,0,NULL);DWORD drives=GetLogicalDrives();HANDLE hdir=CreateFile(filename,FILE_LIST_DIRECTORY,FILE_SHARE_READ | FILE_SHARE_DELETE | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_FLAG_BACKUP_SEMANTICS,NULL);if(hdir==INVALID_HANDLE_VALUE)cout<<"error";LPVOID lpBuffer=new TCHAR[500];DWORD ret;TCHAR str[50];TCHAR *p=(TCHAR*)pbFile;p[0]=0xfeff;p++;int x;int n;x=wcslen(filename);while(1){ReadDirectoryChangesW(hdir,lpBuffer,500*sizeof(TCHAR),TRUE,FILE_NOTIFY_CHANGE_FILE_NAME + FILE_NOTIFY_CHANGE_DIR_NAME + FILE_NOTIFY_CHANGE_ATTRIBUTES +FILE_NOTIFY_CHANGE_SIZE + FILE_NOTIFY_CHANGE_LAST_WRITE + FILE_NOTIFY_CHANGE_LAST_ACCESS + FILE_NOTIFY_CHANGE_CREATION + FILE_NOTIFY_CHANGE_SECURITY,&ret,NULL,NULL);if((((FILE_NOTIFY_INFORMATION*)lpBuffer)->FileNameLength)!=NULL){switch(((FILE_NOTIFY_INFORMATION*)lpBuffer)->Action){case FILE_ACTION_ADDED:{n=wcslen(L"添加文件: ");wcsncpy(p,L"添加文件: ",n);p+=n;}break;case FILE_ACTION_REMOVED:{n=wcslen(L"删除文件: ");wcsncpy(p,L"删除文件: ",n);p+=n;}break;case FILE_ACTION_MODIFIED:{n=wcslen(L"修改文件: ");wcsncpy(p,L"修改文件: ",n);p+=n;}break;case FILE_ACTION_RENAMED_OLD_NAME:{n=wcslen(L"重命名(旧名字): ");wcsncpy(p,L"重命名(旧名字): ",n);p+=n;}break;case FILE_ACTION_RENAMED_NEW_NAME:{n=wcslen(L"重命名(新名字): ");wcsncpy(p,L"重命名(新名字): ",n);p+=n;}break;default:{n=wcslen(L"不知道的行为: ");wcsncpy(p,L"不知道的行为: ",n);p+=n;}}wcsncpy(p,filename,x);p+=x;wcsncpy(p,(TCHAR*)((int)lpBuffer+12),(((FILE_NOTIFY_INFORMATION*)lpBuffer)->FileNameLength)/2);p+=(((FILE_NOTIFY_INFORMATION*)lpBuffer)->FileNameLength)/2;p[0]=0xd; p[1]=0xa; p+=2;}}}
其中,ReadDirectoryChangesW函数的第5个参数可以是许多值的和,这此可能值为:FILE_NOTIFY_CHANGE_FILE_NAME0x00000001、FILE_NOTIFY_CHANGE_DIR_NAME 0X00000002、FILE_NOTIFY_CHANGE_ATTRIBUTES0x00000004、FILE_NOTIFY_CHANGE_SIZE 0x00000008、FILE_NOTIFY_CHANGE_LAST_WRITE0x00000010、FILE_NOTIFY_CHANGE_LAST_ACCESS 0x00000020、FILE_NOTIFY_CHANGE_CREATION0x00000040、FILE_NOTIFY_CHANGE_SECURITY 0x00000100。关于这个函数的用法,参见VC++ SDK中的说明。运行这个程序的方法为:把要监视的文件夹拖到这个程序上,然后再做别的事,完了会在C盘生成名为filesystemchangeinfo.txt的文本文件,记录在监视的文件夹里发生的文件变动。
更多追问追答
追问
额…… 内个…… 能发个编译器能读懂的格式吗? 比如:
#include
#include
#include
using namespace std;
void main(int argc, TCHAR* argv[])
{
if(argc!=2)
追答
那你重新输入一下吧,其实是百度规定的换行符和VC++编译器规定的不一样,只要在每行末尾改改就行。还有,只是显示几个API给你看看。你可以使用微软的rich gditer控件来显示文本,也可以自己处理显示。自己处理显示输入是难点,可以参考VC++ sample里的IME工程的内容。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询