DOBON.NETプログラミング道掲示板

■34418 / 親記事)  フォルダ内の全ての容量を取得したい
  
□投稿者/ susu 一般人(1回)-(2020/01/01(Wed) 21:26:24)
  • アイコン環境/言語:[C#] 
    分類:[.NET] 

    お世話になります。
    C#でフォルダ内のファイル容量(サブフォルダ含め)を取得したいと思いますが
    DirectoryInfoを使うと遅いのでFileSyatemObjectのGetFolderを使いたく下記の
    ようにしましたが最後の行でHRESULT からの例外:0x800A0046とエラーになります
    何が悪いのでしょうか?よろしくお願いします。

    private long GetFolderSize(string path)
    {
      long size = -1;
    Scripting.FileSystemObject fso = new Scripting.FileSystemObject();
    Scripting.Folder Fd = fso.GetFolder(path);
    return Fd.Size;
    }
マルチポストを報告
違反を報告
引用返信 削除キー/
■34419 / ResNo.1)  Re[1]: フォルダ内の全ての容量を取得したい
□投稿者/ jikoryuu 一般人(1回)-(2020/01/03(Fri) 13:20:38)
  • アイコンコードを試してみたところ特にエラーにはなりませんでした
    あと思い当たることはファイル容量がlongを超えている可能性があります
    double型にすれば問題を回避することができるはずです

    private double GetFolderSize(string path)
    {
    Scripting.FileSystemObject fso = new Scripting.FileSystemObject();
    Scripting.Folder Fd = fso.GetFolder(path);
    return Fd.Size;
    }
違反を報告
引用返信 削除キー/
■34420 / ResNo.2)  Re[2]: フォルダ内の全ての容量を取得したい
□投稿者/ Azulean 大御所(513回)-(2020/01/03(Fri) 17:28:13)
  • アイコンNo34418に返信(susuさんの記事)
    > 最後の行でHRESULT からの例外:0x800A0046とエラーになります
    > 何が悪いのでしょうか?

    0x800A0046 で検索すると "Scripting" を使った事例で "0x800A0046 (CTL_E_PERMISSIONDENIED)**" と書かれていますし、「配下にアクセス許可がないフォルダーがある」ということではないですか?
    もしくは、My Documents などの特殊なディレクトリがあるなど。

    こういった理由がある場合、Scripting.Folder の Size プロパティではやりたいことができないということになります。
    アクセス許可がない、あるいは特殊なフォルダーを飛ばして計算するようなコードを別途作っていただくことになりそうです。


    No34419に返信(jikoryuuさんの記事)
    > コードを試してみたところ特にエラーにはなりませんでした
    > あと思い当たることはファイル容量がlongを超えている可能性があります

    ちなみに、 C# の long 型は 64bit ですので、「long を超える」ということは「2 の 63 乗を超える、つまり 8PB(=8,192TB) を超える」ということになります。
違反を報告
引用返信 削除キー/
■34421 / ResNo.3)  Re[3]: フォルダ内の全ての容量を取得したい
□投稿者/ susu 一般人(2回)-(2020/01/04(Sat) 13:47:46)
  • アイコンjikoryuuさんAzuleanさんありがとうございます。
    「path」に「My Documents」を指定していました。別のフォルダでは問題なく
    容量を取得できました。特殊フォルダー等は加味しないことにしました。また
    念のためlong型をdouble型に変更しようと思います。
    ありがとうございました。
解決み!
違反を報告
引用返信 削除キー/
■34424 / ResNo.4)  Re[4]: フォルダ内の全ての容量を取得したい
□投稿者/ 魔界の仮面弁士 大御所(1273回)-(2020/01/06(Mon) 12:31:56)
  • アイコン
    No34418に返信(susuさんの記事)
    > C#でフォルダ内のファイル容量(サブフォルダ含め)を取得したいと思いますが
    
    Size プロパティで返される値は、必ずしも実際のディスク使用量とは
    一致していない点に御注意ください。
    (単にファイルサイズの論理合計を返しているのだと思います)
    https://www.haruru29.net/blog/storage-allocation-unit-size/
    
    
    
    ■No34421に返信(susuさんの記事)
    >>> long size = -1;
    > 念のためlong型をdouble型に変更しようと思います。
    
    FileSystemObject ライブラリにおいては、
    Folder オブジェクトの Size プロパティが、
    2 GiB を境に戻り値のデータ型が変わるようです。
    
    2147483647 以下の場合、int 型(C#) / Long 型(VBA)の値を返し、
    2147483648 以上の場合、double 型(C#) / Double 型(VBA) の値を返しました。
    
    
    
    参考までに、整数値を誤差無く保持するために使用できる
    C# の数値型と、それぞれの上限値を記しておきます。
    
    1:decimal 型なら『(2 の 96乗) - 1』バイトまで (約 65536 YiB )
    2:  ulong 型なら『(2 の 64乗) - 1』バイトまで(約 16 EiB)
    3:   long 型なら『(2 の 63乗) - 1』バイトまで(約 8 EiB)
    4: double 型なら『(2 の 53乗) - 1』バイトまで(約 8 PiB)
    5:   uint 型なら『(2 の 32乗) - 1』バイトまで(約 4 GiB)
    6:    int 型なら『(2 の 31乗) - 1』バイトまで(約 2 GiB)
    7:  float 型なら『(2 の 24乗) - 1』バイトまで(約 16 MiB)
    
    ----
    1:decimal 型[128bit] → 79,228,162,514,264,337,593,543,950,335
    2:  ulong 型 [64bit] → 18,446,744,073,709,551,615
    3:   long 型 [64bit] → 9,223,372,036,854,775,807
    4: double 型 [64bit] → 9,007,199,254,740,991
    5:   uint 型 [32bit] → 4,294,967,295
    6:    int 型 [32bit] → 2,147,483,647
    7:  float 型 [32bit] → 16,777,216

解決み!
421×580 => 181×250
イメージ
02.png
/14KB
違反を報告
引用返信 削除キー/



スレッド内ページ移動 / << 0 >>

このスレッドに書きこむ

Mode/  Pass/


- Child Tree -