C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: System.IO.DriveInfoの挙動について


(過去ログ 107 を表示中)

[トピック内 2 記事 (1 - 2 表示)]  << 0 >>

■63534 / inTopicNo.1)  System.IO.DriveInfoの挙動について
  
□投稿者/ Unripe01 (11回)-(2012/09/04(Tue) 17:02:59)

分類:[.NET 全般] 

いつもお世話になっております。

掲題について、
ドライブ情報を取得するDriveInfoメソッドを利用しても
TotalSize
TotalFreeSpace
が正しく取得できないケースが存在しているように思います。

どなたか、当メソッドの仕様について詳しく記載されているURL、情報がありましたら
教えていただけませんでしょうか。
理由が分からず、途方に暮れております。

検証環境は以下となっています。
よろしくお願い申し上げます。


環境:Visual Studio 2010 
言語:C#.NET Framework 4.0
OS:Windows7

■読み込み対象のドライブ
CD/DVD/BD  RW+

■読み込みできないメディアタイプ
CDRWを
UDF2.01でフォーマットし、かつマスタ形式でファイルの書き込みを行った時

Windowsからドライブのプロパティを確認すると
容量702MB(73696896)と表示されるのですが、
実際にDriveInfoのインスタンスを作成後、TotalSizeを確認しても
636928という全く低い数値になってしまいます。
上記値がどこから来たのか、分からない状態です。

プロパティ画像
http://thinwallets.toypark.in/mm/files/prop.png
その他ライブファイルシステム等で作成したメディアは正しく取得できます。

■ソースコード

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Runtime.InteropServices;

namespace GetDiskFreeSpaceEx
{
	class Program
	{
		static void Main( string[] args )
		{
			//やっぱり取得できない
			Console.WriteLine( "■.NET 正しく取得できない" );
			UseDriveInfo();
			Console.WriteLine( "" );
			//正しく取得できない
			Console.WriteLine( "■API 正しく取得できない" );
			UseGetDiskFreeSpaceEx();

		}

		[System.Runtime.InteropServices.DllImport("kernel32.dll",
			CharSet = System.Runtime.InteropServices.CharSet.Auto)]
		[return: System.Runtime.InteropServices.MarshalAs(
			System.Runtime.InteropServices.UnmanagedType.Bool)]
		public static extern bool GetDiskFreeSpaceEx(
			string lpDirectoryName,
			out ulong lpFreeBytesAvailable,
			out ulong lpTotalNumberOfBytes,
			out ulong lpTotalNumberOfFreeBytes);

		/// <summary>
		/// API使ってみる
		/// </summary>
		static void UseGetDiskFreeSpaceEx( )
		{
			//呼び出し側が利用できるバイト数
			ulong freeBytesAvailable;
			//ディスク全体のバイト数
			ulong totalNumberOfBytes;
			//ディスク全体の空きバイト数
			ulong totalNumberOfFreeBytes;

			//ディスク"F"の空き容量を取得する
			GetDiskFreeSpaceEx( "F:\\", out freeBytesAvailable,
				out totalNumberOfBytes, out totalNumberOfFreeBytes );

			Console.WriteLine( "呼び出し側が利用できるバイト数:{0}",
				freeBytesAvailable );
			Console.WriteLine( "ディスク全体のバイト数:{0}",
				totalNumberOfBytes  );
			Console.WriteLine( "ディスク全体の空きバイト数:{0}",
				totalNumberOfFreeBytes );
		}

		/// <summary>
		/// .NET版
		/// </summary>
		static void UseDriveInfo(){
			System.IO.DriveInfo drive = new System.IO.DriveInfo( "F" );
			Console.WriteLine( "呼び出し側が利用できるバイト数:{0}",
				 drive.AvailableFreeSpace );
			Console.WriteLine( "ディスク全体のバイト数:{0}",
				drive.TotalSize  );
			Console.WriteLine( "ディスク全体の空きバイト数:{0}",
				drive.TotalFreeSpace );
		}

	}
}



引用返信 編集キー/
■63639 / inTopicNo.2)  Re[1]: System.IO.DriveInfoの挙動について
□投稿者/ Unripe01 (12回)-(2012/09/19(Wed) 09:50:46)
お世話になります。
自己回答します。

その後、色々と試してみたところ、どうやら
マスタ形式の書き込みメディアの詳細な情報は
GetDriveInfo()では取得できないようです。

IMAPI2(MSのImage Mastering APIというAPI群)を使えば、メディア形式や
空き容量等が正しく取得できました。

利用メソッドは以下
[DispId(262)]
void InitializeDiscRecorder([MarshalAs(UnmanagedType.BStr)] String recorderUniqueId);

慣れないコーディングを行ってしまい、煩雑かつ無駄に膨大になってしまいました。
APIの利用方法はサンプルサイトも多くあるため、
取り急ぎ、上記利用メソッドの利用方法を連携致します。


他:IMAPI利用方法
http://social.msdn.microsoft.com/Forums/en/wpf/thread/4159cc0d-b517-40e2-9e8e-5b2a0c960359


解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -