net自訂安裝程式捷徑

來源:互聯網
上載者:User

標籤:des   style   blog   http   color   使用   

建立捷徑對於絕大多數 Windows 使用者來說都是小菜一碟了,然而,這項工作卻為程式員帶來不少麻煩。.NET 沒有提供簡便直接的建立捷徑的方法,那麼在 .NET 中我們如何為應用程式建立捷徑呢?

 

1. 捷徑檔案

捷徑實質上是一個副檔名為 .LNK 的檔案。右擊一個捷徑檔案並選擇屬性,跳到捷徑選項卡,2所示:

你可以看到一個捷徑包含如下資料:

  • 捷徑的名字
  • 捷徑所指向的目標所在的位置
  • 捷徑所指向的目標的工作目錄
  • 啟用該捷徑的熱鍵
  • 捷徑所指向的目標運行時的視窗風格(普通、最大化和最小化)
  • 該捷徑的描述性文字
  • 捷徑的表徵圖所在的位置

 

2. 使用 WSH 建立捷徑

2.1 添加 WSH 的引用

這裡我使用 Visual C# 2005 Express Edition Beta 2 來開發的,添加引用的方法非常簡單,右擊你的項目並選擇添加引用,選擇 COM 選項卡並選擇 Windows Script Host Object Model,3所示:

2.2 建立你的捷徑

建立一個捷徑的完整代碼如下:

// Code #01

using System;
using IWshRuntimeLibrary;

class Program
{
    static void Main(string[] args)
    {
        WshShell shell = new WshShell();
        IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(
            Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) +
            "\\" + "Allen‘s Application.lnk"
            );
        shortcut.TargetPath = System.Reflection.Assembly.GetExecutingAssembly().Location;
        shortcut.WorkingDirectory = System.Environment.CurrentDirectory;
        shortcut.WindowStyle = 1;
        shortcut.Description = "Launch Allen‘s Application";
        shortcut.IconLocation = System.Environment.SystemDirectory + "\\" + "shell32.dll, 165";
        shortcut.Save();
    }
}

首先,我們建立一個 WshShell 的執行個體對象,接著通過該對象的 CreateShortcut 方法來建立 IWshShortcut 介面的執行個體對象,傳遞給 CreateShortcut 方法的參數是將要建立的捷徑的完整路徑(包括該捷徑的名字)。接下來,我們就要設定 IWshShortcut 執行個體對象的相關屬性值了。

2.3 設定捷徑的屬性

2.3.1 TargetPath

該屬性僅用於設定或者讀取捷徑的目標所在的位置。Code #01 中,將要建立的捷徑指向本應用程式。

2.3.2 WorkingDirectory

該屬性指定應用程式的工作目錄,當使用者沒有指定一個具體的目錄時,捷徑的目標應用程式將使用該屬性所指定的目錄來裝載或儲存檔案。

2.3.3 WindowStyle

該屬性指定捷徑的目標應用程式的視窗為普通(原始)狀態、最小化或者最大化。對比圖1中 Run 下拉式功能表的項,該屬性的值及其意義如下:

Value Meaning
1 Normal window
3 Maximized
7 Minimized

2.3.4 Description

該屬性設定用於設定或者讀取捷徑的附加說明。

2.3.5 IconLocation

該屬性用於指定捷徑的圖表的所在位置,它的值包含一個完整的路徑和一個索引值。Code #01 中,捷徑的表徵圖被設定為系統檔案夾中的 Shell32.DLL 檔案所包含的第165個表徵圖。

2.4 產生捷徑

CreateShortcut 僅僅建立一個 IWshShortcut 的執行個體對象,它不會為你產生任何捷徑,當一切就緒後,你必須調用 IWshShortcut.Save 方法才能產生捷徑檔案。

 

3. 活用捷徑簡化操作

想象一下你的應用程式支援命令列參數組合運行,例如:

App /out:output.txt /sortby:date /desc

而你又希望只需要輕輕按下 CTRL+ALT+F11 就可以直接啟動這項功能,這時你就需要用到 IWshShortcut 的 Arguments 和 Hotkey 兩個屬性了:

// Code #02

shortcut.Arguments = "/out:output.txt /sortby:date /desc";
shortcut.Hotkey = "CTRL+ALT+F11"; 

注意:Hotkey 屬性的值裡面不能包含空格。

你可以在應用程式裡面像平常那樣處理命令列參數:

// Code #03

class Program
{
    static void Main(string[] args)
    {
        foreach (string arg in args)
        {
            Console.WriteLine(arg);
        }
    }
}

// Output:
//
// /out:output.txt
// /sortby:date
// /desc

現在,你把這個捷徑放到案頭,每當你需要啟動並執行時候,輕輕的按下 CTRL+ALT+F11 就行了,Cool ~ ~ ~

 

Appendix A

Mattias Sjogren 建立了一個名叫 ShellShortcut 的封裝類(wrapper class),你可以在你的項目中直接使用它。有興趣的話,你也可以對其進行一番研究。

註:以上部分為摘抄

 

按照上面的建立出一個連結後,想刪除掉怎麼辦了。發現這個類裡面沒有相應的刪除函數,仔細想想,這個連結應該是個檔案,應該可以拿刪除檔案的方法來刪除。上網一查,還真是,呵呵。做法是:能

先用找到連結相應的路徑,然後查看連結檔案是否存在,如果存在就將是刪除掉。

我自己的代碼:

 

                string filepath = Environment.GetFolderPath(Environment.SpecialFolder.Startup) +

                    "\\" + "XXX.lnk";

                if(System.IO.File.Exists(filepath))

                {

                    System.IO.File.Delete(filepath);

                }

以下部分為摘抄:

原文地址:
http://www.codeproject.com/KB/cs/SharpWipe.aspx
您可以在上述地址中獲得原始碼

       事實上,調用File.Delete並沒有刪除檔案,它只是讓作業系統認為檔案不存在,檔案在磁碟上的空間被標記成空的,以便用於再次使用。但是檔案的資料沒有被移除,您可以非常容易恢複。被刪除的檔案直到相應的空間被重寫才會真消失,這也許要很長時間。

       作者提供了一個簡單的類,它被用來在刪除檔案之前向檔案寫入垃圾資料,這樣就令檔案的資料不再存在。
為了實現這一步,需將檔案大小置為0位元組,並且修改了檔案日期。不過,修改檔案日期只能在FAT16/32上有效,在NTFS上就沒效果。

       在使用Ontrack EasyRecovery,PC Inspector File Recovery和GetDataBack測試後,已經做到不能恢複任何檔案了。在刪除一個文字檔後,我即使運行Investigator,確認獨立的簇,還是無法從這檔案得到一個文字。

        代碼
        你只需要調用一個方法:WipeFile,下面是這個方法的代碼:
如果你調用了WipeFile,你需要提供要刪除檔案的絕對路徑和你想重寫資料的次數。
public void WipeFile(string filename, int timesToWrite)
{
    try {
        if (File.Exists(filename)){
            File.SetAttributes(filename, FileAttributes.Normal); //設定檔案的屬性為正常,這是為了防止檔案是唯讀
            double sectors = Math.Ceiling(new FileInfo(filename).Length/512.0); //計算檔案中的扇區數目
            byte[] dummyBuffer = new byte[512]; // 建立一個扇區大小的虛擬緩衝
            RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); //建立一個加密隨機數目產生器這是我用來產生垃圾資料的。
            FileStream inputStream = new FileStream(filename, FileMode.Open);  //開啟這個檔案的FileStream
            for (int currentPass = 0; currentPass < timesToWrite; currentPass++){
                UpdatePassInfo(currentPass + 1, timesToWrite);
                inputStream.Position = 0;
                // 迴圈所有的扇區
                for (int sectorsWritten = 0; sectorsWritten < sectors; sectorsWritten++){
                    UpdateSectorInfo(sectorsWritten + 1, (int) sectors);
                   // 把垃圾資料填充到流中
                    rng.GetBytes(dummyBuffer);
                    inputStream.Write(dummyBuffer, 0, dummyBuffer.Length);           
                    sectorsWritten++;
                }
            }
            inputStream.SetLength(0);
            inputStream.Close();
            // 原始日期需要清空
            DateTime dt = new DateTime(2037, 1, 1, 0, 0, 0);
            File.SetCreationTime(filename, dt);
            File.SetLastAccessTime(filename, dt);
            File.SetLastWriteTime(filename, dt);
            File.Delete(filename); // 最後刪除檔案

            WipeDone();
        }
    }
    catch(Exception e){
        WipeError(e);
    }
}

作者還添加了幾個事件,以便在處理過程中知道發生什麼
•PassInfoEvent-返回哪個通道正在運行,和啟動並執行通道的總數。
•SectorInfoEvent-返回哪個硬碟扇區正在被寫上資料,和扇區的總數
•WipeDoneEvent-wipe處理過程完成的指標

•WipeErrorEvent-如果發生錯誤就返回一個異常 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.