none
如何使用程式來更改 「磁碟機代碼」 RRS feed

  • 問題

  • 各位前輩您好:

    我剛才在本論壇看了一篇 「 有沒有辦法修改 隨身碟的磁磁 序號 」 (http://social.msdn.microsoft.com/Forums/zh-TW/233/thread/32d0b8a1-f3ea-443d-a15c-a1d3c2f25657) 提問,
    裡面 Bill Chung  前輩有提到 那個原問是不是欲更改 磁碟機代碼....
    後來我思考也 google 了一下,如果直接在 google 上打上 「變更 磁碟機代碼」 或相關的
    好像都不是我要的
    所以,相請各位前輩是否能給我個指點

    如果是要寫個程式「用程式的方式」來設定「磁碟機代號」 ---> 請問這個要用哪個類別物件來實作? 或者用什麼方法?

    再者,如果我想指定一個資料匣,然後再把它指派它成一個磁碟機,請問這個又要如何辦到呢?

    再請各位前輩給我個指導,謝謝。
    萬丈高樓平地起,只要有心不艱辛
    2009年7月1日 上午 05:54

解答

  • HI,

    您可以呼叫SetVolumeLabel 函數
    2009年7月1日 上午 07:06
  • 直接掛目錄好像是不行的,因為在 Windows 系統中,只有 Volume 可以掛成磁碟機。

    這個工作會至少用到兩個 API:

    GetVolumeNameForVolumeMountPoint():取得使用在 SetVolumeMountPoint() 的掛載點名稱,以供 SetVolumeMountPoint() 叫用。
    SetVolumeMountPoint():設定 Volume 的掛載點。

    其他還有列舉出磁碟機中已有的 Volume 的函式 FindFirstVolume() 與 FindNextVolume() 等等,在 C# 可利用 P/Invoke 來叫用。

    如果你想要掛目錄,那你需要寫一支系統級程式(例如核心程式或是 Device Driver),把目錄模擬成 Volume(即讓系統把目錄視為 Volume),才可以使用 Volume Management API 來掛磁碟機代號,不然,用捷徑其實比較輕鬆吧 ...
    小人物一枚。
    2009年7月2日 上午 03:30
    版主

所有回覆

  • HI,

    您可以呼叫SetVolumeLabel 函數
    2009年7月1日 上午 07:06
  •             DriveInfo drive = new DriveInfo("C:\\");
                drive.VolumeLabel = "System";
    這樣子可以變更磁碟機代碼,您第二個問題我不太確定您要的內容,或許您在同一個類別中可以找到相關解法。


    2009年7月1日 下午 04:50
  • 謝謝 tihs 前輩的指導~
    這個函數我昨天也有去找了一些資訊,順便在此 Post 上來~
    好方便之後如果有需要的人也可以來參考

    1. DriveInfo..::.VolumeLabel Property  ( http://msdn.microsoft.com/en-us/library/system.io.driveinfo.volumelabel.aspx )

    2. SetVolumeLabel (Kernel32) ( http://www.pinvoke.net/default.aspx/kernel32/SetVolumeLabel.html )

    3. C# 取得 硬碟機 序號 ( 物理 / 邏輯 磁碟) ( http://www.dotblogs.com.tw/PowerHammer/archive/2008/03/24/2077.aspx )

    4. VB中操作目录的Winodws API ( http://www.cndw.com/tech/program/2006051873546.asp )

    5. 源码下载:设置磁盘卷标和获取驱动器类型的API ( http://www.wewill.cn/n34342c25.aspx )

    6. How we can Get Logical drive Setting and Setting the Volume Label Using Win32 System Services.  ( http://www.devasp.net/net/articles/display/636.html )

    而 tihs 前輩您所指導的,我今天會實作看看~
    如果再有問題也再請您及其他前輩高手指導,謝謝。







    萬丈高樓平地起,只要有心不艱辛
    2009年7月2日 上午 12:50
  • Hi~ gipi 前輩~ 謝謝您的回覆,

    您所用的 DriveInfo 類別中的 VolumeLabel 屬性 好像是只能改變磁碟機的 標籤
    好像不能改 磁碟機 代碼
    例如:原本一台磁碟機是叫 H 槽,透過程式的設定,我想把 H 槽改成 (指定為) S 槽 [ 即放棄原本的 H 槽改成 S 槽的意思 ]。


    原您所提及我發問的第二個問題....我的意思是
    例如:  我想把 D:\tempFolder\Source 這個目錄設定為 S 槽,其目的是為了好讓 User 可以不用很麻煩地每次找到該目錄,
    直接像是一個 Disk 一樣,指派個 S 槽 ,以後 User 只要直接點選 S 槽 就能直接進入該目錄中。


    gipi 前輩~ 很不好意思,可能我的原文 Post 的內容不是很清楚,讓您有所誤解,
    如果您有不錯的方法,也請您能再次地給我指導,謝謝。


    萬丈高樓平地起,只要有心不艱辛
    2009年7月2日 上午 01:03
  • 直接掛目錄好像是不行的,因為在 Windows 系統中,只有 Volume 可以掛成磁碟機。

    這個工作會至少用到兩個 API:

    GetVolumeNameForVolumeMountPoint():取得使用在 SetVolumeMountPoint() 的掛載點名稱,以供 SetVolumeMountPoint() 叫用。
    SetVolumeMountPoint():設定 Volume 的掛載點。

    其他還有列舉出磁碟機中已有的 Volume 的函式 FindFirstVolume() 與 FindNextVolume() 等等,在 C# 可利用 P/Invoke 來叫用。

    如果你想要掛目錄,那你需要寫一支系統級程式(例如核心程式或是 Device Driver),把目錄模擬成 Volume(即讓系統把目錄視為 Volume),才可以使用 Volume Management API 來掛磁碟機代號,不然,用捷徑其實比較輕鬆吧 ...
    小人物一枚。
    2009年7月2日 上午 03:30
    版主

  • 哈哈~
    果然是小朱前輩厲害
    一語說中所有我可能已經會用的東西

    小朱前輩~ 您真的很厲害
    真的很感謝你的回答~ 讓我對目錄要掛成 Disk 有個更明確的方向去實做~ 謝謝。

    其實,我會想試做這程式的原因,
    是因為我有用一個小軟體....軟體檔案名稱是 JMounter.exe,
    它的 Form Title 是 JMounter (Mount and unmount virtual drive)
    相關資訊及下載:http://home.megapass.co.kr/~woosjung/Product_JMount.html

    是因為我看到這小軟體,再加上看到之前的「有沒有辦法修改 隨身碟的磁磁 序號」一文
    所以想說來試著寫寫看,
    並且想說來改良 JMounter 他一些東西
    例如:如果掛個資料目錄上去後,不能改變新掛上去的 VolumeName....

    總之,謝謝小朱前輩您的再次的指導,謝謝你。
    待我實作後,如果還有任何問題,我再發文請教您及其他諸位高手前輩,

    再次地謝謝小朱前輩、 tihs前輩及 gipi前輩的回覆及解答~~感恩~~



    萬丈高樓平地起,只要有心不艱辛
    2009年7月2日 上午 04:41
  • 不知上朮的API可以用C#去呼叫嗎...
    因為想用C#去改 DISK VolumeLabel


    flair
    2009年7月5日 下午 12:59
  • Windows API 可以,可參考下列範例(來源為:http://www.pinvoke.net/default.aspx/kernel32.SetVolumeLabel):

    using System;
    using System.Runtime.InteropServices;
    
    namespace PInvoke.Test
    {
    
        class NameChanger
        {
            [DllImport("kernel32.dll")]
            static extern bool SetVolumeLabel(string lpRootPathName, string lpVolumeName);
    
            [STAThread]
            public static void Main()
            {
                if(SetVolumeLabel("C:\\","PInvokeC Drive"))
                    Console.WriteLine("Name Changed");
                else
                    Console.WriteLine("Unable to change");
            }
        }
    }
    

    小人物一枚。
    2009年7月5日 下午 01:57
    版主
  • 如果是更改磁碟區序號 要如何呼叫呢? 可否提供SAMPLE
    flair
    2009年7月10日 上午 07:58
  • 改序號的 sample 只有 C++ 版。
    你可以自己去 codeproject.com 中搜尋,我上次看到 C++ 的版本就是在那裡。
    小人物一枚。
    2009年7月13日 上午 02:45
    版主