■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 );
}
}
}
|
|