- PR -

C#でWindows XPでのドライブレターの変更を行うには?

投稿者投稿内容
NEU
常連さん
会議室デビュー日: 2005/11/02
投稿数: 20
お住まい・勤務地: 東京都
投稿日時: 2006-04-30 02:52
お世話になります。

掲題のとおりですが、C#を使ってCDROMドライブのドライブレターを(自動的に)変更する方法を探しています。

Eドライブ(CDROM0)をTドライブ(CDROM0)とかに変更する

もともとWSH + WMI + JScriptで探していたのですが、どうやら不可能の様なので、C#なら(もといC++でもいいのですが・・。)出来るのではないかと思い探して見たものの中々見つからず、投稿させて頂いてます。。

どの様なアドバイス/ご指摘でも結構ですので、よろしくお願い致します。
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2006-04-30 10:04
SetVolumeMountPoint APIを使います。

.NET Frameworkに同様の機能が用意されているか確認していません。WMI経由での取得はともかく、変更するにはAPIを呼ぶ以外に無い予感がします。
NEU
常連さん
会議室デビュー日: 2005/11/02
投稿数: 20
お住まい・勤務地: 東京都
投稿日時: 2006-04-30 23:20
ご回答ありがとうございます。

早速見せて頂きました。
ちょっと今の私では敷居が高そうなので、もうちょっと勉強してから試して見ます。

ちなみに、頂いた情報以外には出来そうにもないみたいですね^^;

おって結果ご連絡致します。
・・・いつになるか分かりませんが。。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-04-30 23:52
引用:

S_Rさんの書き込み (2006-04-30 23:20) より:

早速見せて頂きました。
ちょっと今の私では敷居が高そうなので、もうちょっと勉強してから試して見ます。


GetVolumeNameForVolumeMountPoint で GUID を取得して、
SetVolumeMountPoint で再マウント (移動) するだけだと思います。

取り急ぎ API の定義だけ。

コード:

    using System.Runtime.InteropServices;

        :

    [DllImport("KERNEL32.DLL", CharSet=CharSet.Auto)]
    private static extern bool SetVolumeMountPoint(
        string volumeMountPoint,
        string volumeName
    );

    [DllImport("KERNEL32.DLL", CharSet=CharSet.Auto)]
    private static extern bool GetVolumeNameForVolumeMountPoint(
        string volumeMountPoint,
        out System.Text.StringBuilder volumeName,
        uint bufferLength
    );


多分こんな感じです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
NEU
常連さん
会議室デビュー日: 2005/11/02
投稿数: 20
お住まい・勤務地: 東京都
投稿日時: 2006-05-05 18:13
返答が大変遅くなりました。

頂いた情報を基に、(知識が乏しい状態で)下記の様なコードを作成してみました。
文法等も大してよく判ってはいないのですが、コンパイルまでは出来ました。
しかし、いざ実行してみると"C:\Windows\Microsoft.Net\framework\v2.0.50727\mscorwks.dll could not be loaded"と表示されます。(Windows XP)

また、Windows 2003では"問題が発生したためプログラムを終了します"と表示されます。

おそらく判る方が見ると一目瞭然か、問題が多数あるとは思うのですが、アドバイス頂けないでしょうか?
よろしくお願いします。

とりあえず、QドライブをDドライブへ変更する様に指定したつもりです。

-------------------------------------------------------------------

using System;
using System.Runtime.InteropServices;

class changeDriveLetter{

[DllImport("KERNEL32.DLL", CharSet=CharSet.Auto)]
private static extern bool SetVolumeMountPoint(
string volumeMountPoint,
string volumeName
);

[DllImport("KERNEL32.DLL", CharSet=CharSet.Auto)]
private static extern bool GetVolumeNameForVolumeMountPoint(
string volumeMountPoint,
out System.Text.StringBuilder volumeName,
uint bufferLength
);

public static void Main(){

uint length = 0x50;
System.Text.StringBuilder volumeName = new System.Text.StringBuilder((int)length);

GetVolumeNameForVolumeMountPoint(@"Q:\",out volumeName,length);

string GUID = volumeName.ToString();

SetVolumeMountPoint(@"D:\",GUID);

}
}


NEU
常連さん
会議室デビュー日: 2005/11/02
投稿数: 20
お住まい・勤務地: 東京都
投稿日時: 2006-05-05 18:16
コードが見づらいため、再投稿します。

コード:
using System;
using System.Runtime.InteropServices;

class changeDriveLetter{

    [DllImport("KERNEL32.DLL", CharSet=CharSet.Auto)]
    private static extern bool SetVolumeMountPoint(
        string volumeMountPoint,
        string volumeName
    );

    [DllImport("KERNEL32.DLL", CharSet=CharSet.Auto)]
    private static extern bool GetVolumeNameForVolumeMountPoint(
        string volumeMountPoint,
        out System.Text.StringBuilder volumeName,
        uint bufferLength
    );
	
	public static void Main(){
		
		uint length = 0x50;
		System.Text.StringBuilder volumeName = new System.Text.StringBuilder((int)length);
		
		GetVolumeNameForVolumeMountPoint(@"Q:\",out volumeName,length);
		
		string GUID = volumeName.ToString();
		
		SetVolumeMountPoint(@"D:\",GUID);
	
	}
}




じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-05 18:32
引用:

S_Rさんの書き込み (2006-05-05 18:16) より:

GetVolumeNameForVolumeMountPoint(@"Q:",out volumeName,length);


とりあえず、ここでの volumeName の中身は確認していますか?
ステップ単位で結果を提示してください。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
NEU
常連さん
会議室デビュー日: 2005/11/02
投稿数: 20
お住まい・勤務地: 東京都
投稿日時: 2006-05-05 19:03
お世話になります。

Mainメソッドの部分を下記の様に変更してみたのですが、
結果は変わりませんでした。

エラーが表示されるだけでした。。

コード:

		uint length = 0x100;
		System.Text.StringBuilder volumeName = new System.Text.StringBuilder((int)length);
		
		GetVolumeNameForVolumeMountPoint(@"Q:\",out volumeName,length);
		
		Console.WriteLine("{0}",volumeName);
		
		
		/*
		string GUID = volumeName.ToString();
		
		SetVolumeMountPoint(@"D:\",GUID);
		*/
		



内容を確認するのに、他に適切な方法はあるのでしょうか?
重ね重ね大変申し訳ありません。

スキルアップ/キャリアアップ(JOB@IT)