免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8100 | 回复: 4
打印 上一主题 下一主题

在win下如何给一个文件加锁LockFile? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-03-23 18:40 |只看该作者 |倒序浏览
请教一下各位,
再win下我想以独占的方式对一个文件进行加锁,加锁后就只有本程序可以访问,而其他程序不能对文件进行访问,等程序运行结束或者解锁后,其他进程才可以访问。
   我用API函数试验了一整天都没搞定,用CreateFile和LockFileEx,

  1. HANDLE hDir = CreateFile ("g:\\test.txt", GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_DELETE|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_WRITE_THROUGH, NULL);
  2. int i=LockFileEx(hDir,LOCKFILE_EXCLUSIVE_LOCK,(DWORD)0, (DWORD)0,  (DWORD)1024,&Oapped  );
复制代码

这样对文件加锁后,自己可以读写,别的程序也还是可以读写,当把CreateFile的第三个参数去掉FILE_SHARE_WRITE这个后,本程序和其他程序都不能写了?
郁闷,文档里说LockFileEx的第二个参数可以不允许其他进程写,可设置了还是一样!
    不解…………
     那位能解答一下,或者还有什么其他的加锁方法么? 3KS

论坛徽章:
0
2 [报告]
发表于 2006-03-24 09:50 |只看该作者
好像createfile和fopen相当于分别创建一个子进程了,即使是在同一个程序里,createfile也必须允许共享写,才能用fopen写打开文件,这样其他程序也就可以操作了。

  除了LockFileEX和LockFile外,在win下还可以怎么来锁文件?

论坛徽章:
0
3 [报告]
发表于 2008-11-06 09:33 |只看该作者
在Create中将第3个参数设成0

论坛徽章:
0
4 [报告]
发表于 2008-11-06 09:36 |只看该作者

参考

static int        lockfile( char *filename, LKHANDLE *lock )
{
#ifdef _OS_WINDOWS
        BOOL        brc;
        DWORD        drc;
        int                rc;

        if( lock == NULL ){
                return        -1;
        }
        ( void )memset( lock, 0, sizeof( *lock ));
       
        if( filename == NULL ){
                return        -1;
        }
       
        lock->hd = CreateFile( filename,
                GENERIC_READ | GENERIC_WRITE,
                FILE_SHARE_READ | FILE_SHARE_WRITE,
                NULL,
                OPEN_ALWAYS,
                FILE_ATTRIBUTE_NORMAL,
                NULL );

        if(lock->hd == INVALID_HANDLE_VALUE){
                lock->hd = NULL;
                return        -1;
        }

        brc = LockFile( lock->hd, 0, 0, 1, 0);
        if(brc != TRUE){
                drc = GetLastError();
                if( drc == ERROR_LOCK_VIOLATION ){
                        rc = 1;               
                } else {
                        rc = -1;
                }
                CloseHandle( lock->hd );
                lock->hd = NULL;
                return        rc;
        }
        ( void )strncpy( lock->pathname, filename, sizeof( lock->pathname ) - 1 );
        return        0;

#else

        int                rc;

        if( lock == NULL ){
                return        -1;
        }
        ( void )memset( lock, 0, sizeof( *lock ));
        lock->fd = -1;
       
        if( filename == NULL ){
                return        -1;
        }

        lock->fd = open( filename, O_RDWR|O_CREAT, 0600);
        if( lock->fd < 0 ){
                return        -1;
        }

        rc = lockf( lock->fd, F_TLOCK, 1 );
        if( rc != 0 ){
#if defined(_OS_HPUX) || defined(_OS_AIX)
                if( errno == EACCES ){
#else        /*        Solaris、Linux        */
                if( errno == EAGAIN ){
#endif
                        rc = 1;       
                } else {
                        rc = -1;
                }
                close( lock->fd );
                lock->fd = -1;
                return        rc;
        }
        ( void )strncpy( lock->pathname, filename, sizeof( lock->pathname ) - 1 );
        return        0;
#endif

}        /*        lockfile()        */

论坛徽章:
0
5 [报告]
发表于 2008-11-06 10:49 |只看该作者
ls的签名很nb啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP