紫水晶编程技术论坛 - 努力打造成全国最好的编程论坛

 找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 4710|回复: 5

[开源] 想让你的某个文件不被删除不被移动不被重命名吗?很简单,see it!!!

  [复制链接]

1214

主题

1566

帖子

11

精华

管理员

菜鸟

Rank: 125Rank: 125Rank: 125Rank: 125Rank: 125

积分
93743

贡献奖关注奖人气王精英奖乐于助人勋章

发表于 2011-10-29 08:24:55 | 显示全部楼层 |阅读模式

  1. #include<windows.h>
  2. #include<stdio.h>
  3. BOOL OccupyFile( LPCTSTR lpFileName );//锁定文件
  4. BOOL ReleaseFile(LPCTSTR lpFileName);//释放文件
  5.          HANDLE hTargetHandle;
  6. int main()
  7. {
  8.      OccupyFile("c:\\111.txt");
  9.          printf("此时文件不能被删除、移动、重命名等\n");
  10.         system("pause");
  11.         ReleaseFile("c:\\111.txt");
  12.     printf("此时文件可以被删除、移动、重命名等\n");
  13.         return 0;
  14. }
  15. void RaiseToDebugP()
  16. {
  17.      HANDLE hToken;
  18.      HANDLE hProcess = GetCurrentProcess();
  19.      if ( OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken) )
  20.      {
  21.          TOKEN_PRIVILEGES tkp;
  22.          if ( LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tkp.Privileges[0].Luid) )
  23.          {
  24.              tkp.PrivilegeCount = 1;
  25.              tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  26.              BOOL bREt = AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, 0) ;
  27.          }
  28.          CloseHandle(hToken);
  29.      }   
  30. }
  31. BOOL OccupyFile( LPCTSTR lpFileName )
  32. {
  33.      BOOL     bRet;
  34.      RaiseToDebugP();
  35.      HANDLE hProcess = OpenProcess( PROCESS_DUP_HANDLE, FALSE, 4);     // 4为system进程号
  36.      if ( hProcess == NULL )
  37.      {
  38.          hProcess = OpenProcess( PROCESS_DUP_HANDLE, FALSE, 8);         // 2K下是 8??
  39.          if ( hProcess == NULL )
  40.              return FALSE;
  41.      }
  42.      HANDLE hFile;
  43.      hFile = CreateFile( lpFileName, GENERIC_READ, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);   
  44.      if ( hFile == INVALID_HANDLE_VALUE )
  45.      {
  46.          CloseHandle( hProcess );
  47.          return FALSE;
  48.      }
  49.      bRet = DuplicateHandle( GetCurrentProcess(), hFile, hProcess, &hTargetHandle,
  50.          0, FALSE, DUPLICATE_SAME_ACCESS|DUPLICATE_CLOSE_SOURCE);
  51.      CloseHandle( hProcess );
  52.      return bRet;
  53. }
  54. BOOL ReleaseFile(LPCTSTR lpFileName)
  55. {
  56.          BOOL     bRet;
  57.      RaiseToDebugP();
  58.      HANDLE hProcess = OpenProcess( PROCESS_DUP_HANDLE, FALSE, 4);   
  59.      if ( hProcess == NULL )
  60.      {
  61.          hProcess = OpenProcess( PROCESS_DUP_HANDLE, FALSE, 8);   
  62.          if ( hProcess == NULL )
  63.              return FALSE;
  64.      }
  65.          bRet=DuplicateHandle(hProcess,hTargetHandle,GetCurrentProcess(),NULL,0,FALSE,DUPLICATE_CLOSE_SOURCE);
  66.          CloseHandle(hProcess);
  67.      return bRet;
  68. }
复制代码
来源:http://www.cctry.com/thread-29414-1-1.html
【VB】QQ群:1422505加的请打上VB好友
【易语言】QQ群:9531809  或 177048
【FOXPRO】QQ群:6580324  或 33659603
【C/C++/VC】QQ群:3777552
【NiceBasic】QQ群:3703755

854

主题

3481

帖子

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

Rank: 125Rank: 125Rank: 125Rank: 125Rank: 125

积分
36100
发表于 2011-10-29 12:59:03 | 显示全部楼层
这个的原理老早就有了。
我还把它弄成了A/B/C三种语言。

16

主题

59

帖子

0

精华

金牌会员

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1240
发表于 2011-10-31 14:37:34 | 显示全部楼层
谢谢咯。

0

主题

94

帖子

0

精华

钻石会员

Rank: 6Rank: 6

积分
3031
发表于 2013-2-26 14:17:37 | 显示全部楼层
谢谢分享

2

主题

47

帖子

0

精华

铜牌会员

Rank: 2Rank: 2

积分
214
发表于 2014-9-8 07:39:45 | 显示全部楼层
文件占坑,确实很好

30

主题

723

帖子

0

精华

钻石会员

Rank: 6Rank: 6

积分
2815
发表于 2015-3-20 10:11:21 | 显示全部楼层
厉害 学习了 Mark
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

手机版|Archiver|紫水晶工作室 ( 粤ICP备05020336号 )

GMT+8, 2024-4-29 13:52 , Processed in 0.025688 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表