c03xp 发表于 2021-1-25 14:58

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;
}

coolcalf 发表于 2021-1-25 15:12

原理
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已被打开')

c03xp 发表于 2021-1-25 15:19

coolcalf 发表于 2021-1-25 15:12
原理
Excel在打开的时候,会产生前缀是~$的临时文件。只要判断该临时文件是否存在即可。



试了一下,excel文件会产生临时文件,打开csv文件没有临时文件

c03xp 发表于 2021-1-25 15:24

发现一个冷门的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打开了文件,我的程序也能读取到内容,一会儿一个样,不知道怎么回事了,放弃算了

c03xp 发表于 2021-1-25 16:04

解决了。用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

提供一个思路,检测文件被占用的进程,然后拿到程序名称,然后判断

c03xp 发表于 2021-1-25 16:51

海绵宝宝_ 发表于 2021-1-25 16:31
提供一个思路,检测文件被占用的进程,然后拿到程序名称,然后判断

知道是否占用就行了,判断被谁占用,估计很麻烦
页: [1]
查看完整版本: win32 如何判断文件已被excel打开