win32 如何判断文件已被excel打开
求大神解答:给一个csv文件建立内存映射文件,映射后如果不用excel打开该文件,可以正常读取,如果用excel打开,读取到的内容全是0,
但是运行过程中没发生任何win32调用错误,也没有返回NULL,我该如何
检测该文件已被excel打开,然后提示先将其关闭?
LPVOID LoadFileR(LPTSTR lpFilename, DWORDdwSize)
{
HANDLE hFile;
HANDLE hMapping;
LPVOID ImageBase;
hFile= CreateFile(lpFilename,GENERIC_WRITE|GENERIC_READ ,0,NULL,OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL,0);
if (NULL == hFile){
return NULL;
}
hMapping= CreateFileMapping(hFile,NULL,PAGE_READWRITE ,0,dwSize,NULL);
if (NULL == hMapping)
{
int i = GetLastError();
CloseHandle(hFile);
return NULL;
}
ImageBase= MapViewOfFile(hMapping,FILE_MAP_WRITE,0,0,0);
CloseHandle(hFile);
CloseHandle(hMapping);
return ImageBase;
}
char* easycsv_csv_loadfile(char* path,unsigned long* psize){
FILE *fp;
unsigned long flen;
if((fp = fopen (path,"r"))==NULL){
return NULL;
}
fseek(fp,0L,SEEK_END);
flen=ftell(fp);
fclose(fp);
*psize = flen;
return (char*)LoadFileR(path,flen);
}
int main(){
int i;
unsigned long flen = 0;
char* csv = easycsv_csv_loadfile("tst.csv",&flen);
printf("csv=%u\n",(unsigned long)csv);
char* p = csv;
for(i=0;i<flen;++i){
printf("p=%c\n",*p++);
}
return 1;
} 原理
Excel在打开的时候,会产生前缀是~$的临时文件。只要判断该临时文件是否存在即可。
import os
def check_excel_is_open():
file_path = 'C:\\Users\\xxxxx\\Desktop'
file_name = 'eeeee.xlsx'
temp_file = file_path + '\\' + '~$' + file_name
if os.path.exists(temp_file):
print('excel已被打开')
coolcalf 发表于 2021-1-25 15:12
原理
Excel在打开的时候,会产生前缀是~$的临时文件。只要判断该临时文件是否存在即可。
试了一下,excel文件会产生临时文件,打开csv文件没有临时文件 发现一个冷门的c函数,百度都找不到几篇文章:
函数原型:int _access(const char *pathname, int mode);
参数:pathname 为文件路径或目录路径 mode 为访问权限(在不同系统中可能用不能的宏定义重新定义)
返回值:如果文件具有指定的访问权限,则函数返回0;如果文件不存在或者不能访问指定的权限,则返回-1.
备注:当pathname为文件时,_access函数判断文件是否存在,并判断文件是否可以用mode值指定的模式进行访问。当pathname为目录时,_access只判断指定目录是否存在,在Windows NT和Windows 2000中,所有的目录都只有读写权限。
mode的值和含义如下所示:
00——只检查文件是否存在
02——写权限
04——读权限
06——读写权限
不过用不上了,我发现现在就算excel打开了文件,我的程序也能读取到内容,一会儿一个样,不知道怎么回事了,放弃算了 解决了。用createfile函数判断是否可读,不知道是不是标准方法。
intIsFileLocked(LPCTSTR szFileName)
{
if(szFileName==NULL) return 0;
HANDLE ret;
ret=CreateFile(szFileName,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(ret==INVALID_HANDLE_VALUE)
{
return 1;
}
CloseHandle(ret);
return 0;
} 提供一个思路,检测文件被占用的进程,然后拿到程序名称,然后判断 海绵宝宝_ 发表于 2021-1-25 16:31
提供一个思路,检测文件被占用的进程,然后拿到程序名称,然后判断
知道是否占用就行了,判断被谁占用,估计很麻烦
页:
[1]