最近很無(wú)聊待榔,就想著用C#做一個(gè)小工具:一鍵刪除桌面快捷方式小箭頭
然而這其中蝠筑,充滿了曲折...
開(kāi)發(fā)中遇到的各種問(wèn)題
- 讀取注冊(cè)表
1.c#中操作注冊(cè)表:RegistryKey,Registry
string Shorts_Path = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons";
RegistryKey Rkey0 = Registry.LocalMachine.OpenSubKey(Shorts_Path,true);//打開(kāi)注冊(cè)表
上面的代碼中,因?yàn)閘ocalmachine注冊(cè)表是系統(tǒng)注冊(cè)表昼扛,所以很容易發(fā)生讀寫(xiě)錯(cuò)誤等問(wèn)題,開(kāi)發(fā)過(guò)程中多次出現(xiàn)無(wú)法訪問(wèn)/創(chuàng)建子項(xiàng)/值
針對(duì)以上問(wèn)題,需要打開(kāi)項(xiàng)目屬性-安全性-啟用ClickOnce安全設(shè)置奠衔,這時(shí)候項(xiàng)目文件夾下會(huì)生成一個(gè)app.maniftest文件,需要修改其中的<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />塘娶,需要修改原本的level值為requireAdministrator归斤,然后取消ClickOnce安全設(shè)置,重新編譯刁岸,會(huì)提示切換用戶脏里,此時(shí)等待重啟再編譯就不會(huì)發(fā)生異常。
- C#設(shè)置文件屬性虹曙、判斷文件是否存在迫横、刪除文件
1.因?yàn)樵谒阉鞯降腷at模式下,需要使用attrib命令酝碳,對(duì)一個(gè)iconcache文件進(jìn)行屬性取消矾踱,使其能夠被刪除,所以C#中也需要對(duì)文件進(jìn)行屬性設(shè)置
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#獲取系統(tǒng)環(huán)境變量
因?yàn)樵诓淮_定用戶系統(tǒng)位置盤(pán)符都統(tǒng)一介返,所以需要讀取系統(tǒng)變量,讀取系統(tǒng)環(huán)境變量需要用到Environment類
string SystemRootDir, UserProfileDir;
SystemRootDir = Environment.GetEnvironmentVariable("systemroot");
UserProfileDir = Environment.GetEnvironmentVariable("userprofile");
SystemDir = SystemRootDir;
UProfile = UserProfileDir;
使用GetEnvironmentVariable方法分別獲取systemroot和userprofile,相當(dāng)于在cmd中調(diào)用%systemroot%和%userprofile%,來(lái)獲取到系統(tǒng)位置
- C#獲取操作系統(tǒng)位數(shù)
在實(shí)際調(diào)試開(kāi)發(fā)的過(guò)程中發(fā)現(xiàn)圣蝎,向localmachine 中的software節(jié)點(diǎn)寫(xiě)入子項(xiàng)刃宵,雖然成功寫(xiě)入,但是寫(xiě)入位置是localmacchine/software/wow6432node路徑徘公,這是因?yàn)橄到y(tǒng)對(duì)于X86和64平臺(tái)的兼容性考慮牲证,在運(yùn)行時(shí)系統(tǒng)會(huì)自動(dòng)轉(zhuǎn)換,所以我們需要在項(xiàng)目設(shè)置-生成-平臺(tái)選擇64位关面,程序就會(huì)向正確的路徑寫(xiě)入坦袍,同時(shí)我們也可以增加機(jī)器平臺(tái)判斷,來(lái)阻止用戶運(yùn)行
bool MachineType = Environment.Is64BitProcess;
if (!MachineType)
{
MessageBox.Show("本軟件在32位操作系統(tǒng)上無(wú)法使用等太,請(qǐng)使用64位操作系統(tǒng)","錯(cuò)誤",MessageBoxButtons.OK,MessageBoxIcon.Error);
Application.Exit();
}
以上使用的是Environment.Is64BitProcess方法來(lái)判斷是否是64位的機(jī)器