关于文本文件和二进制文件
1、二进制文件是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放,也就是说存放的是数据的原形式
2、文本文件是把数据的终端形式的二进制数据输出到磁盘上存放,也就是说存放的是数据的终端形式
文本文件与二进制文件在计算机文件系统中的物理存储都是二进制的,也就是在物理存储方面没有区别都是01码,这个没有异议,他们的区别主要在逻辑存储上,也就是编码上。
文本文件格式存储时是将值作为字符然后存入其字符编码的二进制,文本文件用‘字符’作为单位来表示和存储数据,比如对于1这个值,文本文件会将其看做字符‘1’然后保存其ASCII编码值(这里假定是ASCII编码),这样在物理上就是0x31这个二进制值,而若是二进制保存1,则直接保存其二进制值,比如如果程序中是处理1为整数则保存的二进制值就是 0x00000001 (4字节)。
一般而言,二进制去操作文件会比较可靠,不会出现乱码的情况
memcpy比strcpy要好用
fread函数在读取之后就会将指针移到读取后的位置
如果涉及到磁盘操作,一定记得操作前加锁,操作后解锁,避免不必要的问题
二进制操作的时候,一定记得要把关键字“b”加上
当一个文件被删除后,在文件系统目录中已经不可见了,然而如果此时还有运行的进程持有这个已经被删除了的文件的句柄,那么这个文件就不会真正在磁盘中被删除
fseek(文件指针,偏移量,0/1/2);关于偏移量的取值,正为向后,负为向前,
比如fseek(fp,-8,SEEK_END),就代表从文件尾前移8个字节
FILE *fp2 = fopen("C:\\Users\\Write_Data2.txt","w+");
上面的句子,会没有创建权限,一般不能写再C盘根目录,写在别的文件夹里,//更正一下,是杀毒软件限制了权限
fopen打开失败的几种情况
1.关于文件路径的参数不对
2.关于mode参数,超出权限
3.句柄泄露,没有遵循及时打开及时关闭的原则
ShellExecute的功能是运行一个外部程序
示例为运行dll_X64.exe,一个微软的dll文件运行库的安装包
ShellExecute(0,"open","dll_X64.exe","","",SW_SHOWNORMAL);
DeleteFile删除失败
检查文件句柄,是否在别处打开没有及时关闭,操作文件一定记得及时打开和关闭句柄
设置文件的属性
SetFileAttributes(D_file_name.c_str(),0); //修改文件属性
常数 值 描述
Normal 0 普通文件。没有设置任何属性。
ReadOnly 1 只读文件。可读写。
Hidden 2 隐藏文件。可读写。
System 4 系统文件。可读写。
Directory 16 文件夹或目录。只读。
Archive 32 上次备份后已更改的文件。可读写。
Alias 1024 链接或快捷方式。只读。
Compressed 2048 压缩文件。只读。
获取当前用户名
char buff[32];
DWORD size = 32;
AnsiString user = GetUserName(buff,&size);
int err = GetLastError();
err = 0;
ShowMessage(buff);//buff里面存储当前用户名
获取文件的最后修改时间,可用于release版本,设置可执行软件的有效期许可证
FILE * fp;
int fd;
struct stat buf;
fp=fopen("Project1.exe","r");//文件名
long int day1;
if(NULL != fp)
{
fd=fileno(fp);
fstat(fd, &buf);
int size = buf.st_size; //get file size (byte)
long modify_time=buf.st_mtime; //latest modification time (seconds passed from 01/01/00:00:00 1970 UTC)
day1 = modify_time/3600/24;
fclose(fp);
}
time_t lt;
lt = time(NULL);//当前系统时间,同modify_time
读取磁盘固定位置的字符
//==============读取G盘0扇区的512字节,系统盘分区要注意权限===========================
HANDLE hFile;
char drive[] = "\\\\.\\G:";
char buf[512];
hFile = CreateFile(drive,GENERIC_READ,
FILE_SHARE_WRITE|FILE_SHARE_READ,
NULL,
OPEN_EXISTING,0,NULL
);
int a = GetLastError();//
if(hFile != NULL)
{
LARGE_INTEGER fileOffset;
SetFilePointer(hFile,0,NULL,FILE_BEGIN);
DWORD lenRead;
ReadFile(hFile,buf,512,&lenRead,NULL);
}
关于判断当前文件夹或者文件是否存在
1. fopen函数原型:FILE *fopen (char *filename, char *type);
filename:文件路径
type:打开文件的方式(有r、w、r+、w+、a、rb、wb等等)
用于判断文件是否存在可以使用 r 或者 rb ,因为使用 其它方式的话,可能会自动建立文件。 返回值为NULL(打不开)和正数(能打开)。
特别提醒:用这种方法做出的判断是不完全正确的,因为有的文件存在,但是可能不可读
2.access函数判断文件夹或者文件是否存在
函数原型: int access(const char *filename, int mode);
所属头文件:io.h
filename:可以填写文件夹路径或者文件路径
mode:0 (F_OK) 只判断是否存在
2 (R_OK) 判断写入权限
4 (W_OK) 判断读取权限
6 (X_OK) 判断执行权限
if ( !access("C://windows",0) )
puts("C://windows EXISITS!");
else
puts("C://windows DOESN'T EXISIT!");
监控文件变化
void DirectoryMonitoring(AnsiString newPath)
{
DWORD cbBytes;
char file_Name[MAX_PATH]; //设置文件名
char file_Name2[MAX_PATH]; //设置文件重命名后的名字
char notify[1024];
char *dir = newPath.c_str();//需要监控的文件夹路径,绝对路径
HANDLE dirHandle = CreateFile(dir, GENERIC_READ | GENERIC_WRITE | FILE_LIST_DIRECTORY,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS,
NULL);
if (dirHandle == INVALID_HANDLE_VALUE) //若网络重定向或目标文件系统不支持该操作,函数失败,同时调用GetLastError()返回ERROR_INVALID_FUNCTION
{
ShowMessage(" The System Does Not Support!" );
}
memset(notify, 0, strlen(notify));
FILE_NOTIFY_INFORMATION *pnotify = (FILE_NOTIFY_INFORMATION*)notify;
// cout << "The system has been started monitoring..." << endl;
while (count < 1)//一只健康就应该while(true)
{
if (ReadDirectoryChangesW(dirHandle, ¬ify, 1024, true,
FILE_NOTIFY_CHANGE_FILE_NAME |
FILE_NOTIFY_CHANGE_DIR_NAME
| FILE_NOTIFY_CHANGE_SIZE,
&cbBytes, NULL, NULL))
{
//转换文件名为多字节字符串
if (pnotify->FileName)
{
char str[100]= {0};
memset(file_Name, 0, strlen(file_Name));
int length = WideCharToMultiByte(CP_ACP, 0, pnotify->FileName, pnotify->FileNameLength / 2, file_Name, 99, NULL, NULL);//返回发生变化的文件名的文件名长度,包括后缀
memcpy(str,file_Name,length);
newFilePath = newPath + str;
}
//获取重命名的文件名
if (pnotify->NextEntryOffset != 0 && (pnotify->FileNameLength > 0 && pnotify->FileNameLength < MAX_PATH))
{
PFILE_NOTIFY_INFORMATION p = (PFILE_NOTIFY_INFORMATION)((char*)pnotify + pnotify->NextEntryOffset);
memset(file_Name2, 0, sizeof(file_Name2));
WideCharToMultiByte(CP_ACP, 0, p->FileName, p->FileNameLength / 2, file_Name2, 99, NULL, NULL);
}
//设置类型过滤器,监听文件创建、更改、删除、重命名等
switch (pnotify->Action)
{
case FILE_ACTION_ADDED:
break;
case FILE_ACTION_MODIFIED:
count++;
fileUpdate(oldFilePath, newFilePath);自定义处理函数,其它case同理
//ShowMessage(name);
break;
case FILE_ACTION_REMOVED:
break;
case FILE_ACTION_RENAMED_OLD_NAME:
break;
default:
ShowMessage("Unknow Command!" );
}
}
}
CloseHandle(dirHandle);
}
文件复制转移
CopyFile(A, B, FALSE);表示将文件A拷贝到B,参数都是绝对路径名
如果B已经存在则覆盖(第三参数为TRUE时表示不覆盖)
B不存在就在相应路径下置放文件A