最近很无聊,就想着用C#做一个小工具:一键删除桌面快捷方式小箭头
然而这其中,充满了曲折...
开发中遇到的各种问题
- 读取注册表
1.c#中操作注册表:RegistryKey,Registry
string Shorts_Path = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons";
RegistryKey Rkey0 = Registry.LocalMachine.OpenSubKey(Shorts_Path,true);//打开注册表
上面的代码中,因为localmachine注册表是系统注册表,所以很容易发生读写错误等问题,开发过程中多次出现无法访问/创建子项/值
针对以上问题,需要打开项目属性-安全性-启用ClickOnce安全设置,这时候项目文件夹下会生成一个app.maniftest文件,需要修改其中的<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />,需要修改原本的level值为requireAdministrator,然后取消ClickOnce安全设置,重新编译,会提示切换用户,此时等待重启再编译就不会发生异常。
- C#设置文件属性、判断文件是否存在、删除文件
1.因为在搜索到的bat模式下,需要使用attrib命令,对一个iconcache文件进行属性取消,使其能够被删除,所以C#中也需要对文件进行属性设置
string SystmDir, Udir;
GetPathName(out SystmDir, out Udir);
string IconCacheDir = $@"{Udir}\AppData\Local\iconcache.db";
bool FileIsExit = File.Exists(IconCacheDir);
if (FileIsExit == true)
{
File.SetAttributes(IconCacheDir,FileAttributes.Normal);
File.Delete(IconCacheDir);
}
以上代码不做解释,文件操作涉及到File类
- C#获取系统环境变量
因为在不确定用户系统位置盘符都统一,所以需要读取系统变量,读取系统环境变量需要用到Environment类
string SystemRootDir, UserProfileDir;
SystemRootDir = Environment.GetEnvironmentVariable("systemroot");
UserProfileDir = Environment.GetEnvironmentVariable("userprofile");
SystemDir = SystemRootDir;
UProfile = UserProfileDir;
使用GetEnvironmentVariable方法分别获取systemroot和userprofile,相当于在cmd中调用%systemroot%和%userprofile%,来获取到系统位置
- C#获取操作系统位数
在实际调试开发的过程中发现,向localmachine 中的software节点写入子项,虽然成功写入,但是写入位置是localmacchine/software/wow6432node路径,这是因为系统对于X86和64平台的兼容性考虑,在运行时系统会自动转换,所以我们需要在项目设置-生成-平台选择64位,程序就会向正确的路径写入,同时我们也可以增加机器平台判断,来阻止用户运行
bool MachineType = Environment.Is64BitProcess;
if (!MachineType)
{
MessageBox.Show("本软件在32位操作系统上无法使用,请使用64位操作系统","错误",MessageBoxButtons.OK,MessageBoxIcon.Error);
Application.Exit();
}
以上使用的是Environment.Is64BitProcess方法来判断是否是64位的机器
网友评论