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

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

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

Re[2]: ディレクトリのサイズを求める。(初歩的な質問だと思います)


(過去ログ 126 を表示中)

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

■74970 / inTopicNo.1)  ディレクトリのサイズを求める。(初歩的な質問だと思います)
  
□投稿者/ にゃー。 (1回)-(2015/02/14(Sat) 13:22:08)

分類:[C#] 

C#を触り始めて4日目くらいの初心者ですが、適当に切って貼って、動くように改良していたらエラーが出ました。
大抵のエラーは弄っていたらなんとかなったのですが、これはどうしようもなくなったので質問させてもらいます。

内容

コンソールアプリケーション

ファイル(ディレクトリ)のドロップによる起動。
ドロップされたもののパスを取得。
→ファイルかディレクトリか判別してフォルダサイズ(ディレクトリなら配下のすべてのファイルのサイズ)を取得。

(何のためにこれを作ったかというと、勉強のため、、、です。)

VS2013Express使用


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


static void Main(string[] args)
        {
            string[] files = System.Environment.GetCommandLineArgs();

            if (files.Length > 1)
            {
                Console.WriteLine("ドロップされました。");

                for (int i = 1; i < files.Length; i++)
                {
                    if(File.Exists(files[i]) == true)
                    {
                        FileInfo fileSize = new FileInfo(files[i]);
                        long size = fileSize.Length;
                        Console.WriteLine("{0}",size);
                    }
                    else
                    {
                        long lTotalFileSize = GetDirectoryFileSize(files[i]); //ここでエラー
                    }
        }
      }
      else
            {
                Console.WriteLine("終了");
            }

      Console.ReadKey();
    }

public static long GetDirectoryFileSize(DirectoryInfo hDirectoryInfo)
        {
            long lTotalSize = 0;

            foreach (System.IO.FileInfo cFileInfo in hDirectoryInfo.GetFiles())
            {
                lTotalSize += cFileInfo.Length;
            }

            foreach (System.IO.DirectoryInfo hDirInfo in hDirectoryInfo.GetDirectories())
            {
                lTotalSize += GetDirectoryFileSize(hDirInfo);
            }

            return lTotalSize;
        }

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

エラー内容

エラー	1	'ConsoleApplication.Program.GetDirectoryFileSize(System.IO.DirectoryInfo)' に最も適しているオーバーロード メソッドには無効な引数がいくつか含まれています。
エラー	2	引数 1: 'string' から 'System.IO.DirectoryInfo' に変換できません。


他の関数から持ってくるのが初めてで正直よくわかってないのが事実です。
初歩的なものだと思いますがどうかよろしくお願いします。

また、C#を学ぶにあたっておすすめの書籍は何でしょうか。
色々見かけますがありすぎて結局何が良いのかよくわかりません。

引用返信 編集キー/
■74971 / inTopicNo.2)  Re[1]: ディレクトリのサイズを求める。(初歩的な質問だと思います)
□投稿者/ 魔界の仮面弁士 (207回)-(2015/02/14(Sat) 14:36:07)
> if(File.Exists(files[i]) == true)
Boolean を返す処理の場合、比較演算子は不要で
 if( File.Exists(files[i]) )
で良いと思いますよ。
 if( (intValue > 0) == true )
とは書かないのと同じ理由で。


さて本題。

> string[] files = System.Environment.GetCommandLineArgs();
この場合、『files』は《string[] 型》なのですから、
> if(File.Exists(files[i]) == true)
ここでいう『filed[i]』は《string 型》になりますよね。

ということは、
> long lTotalFileSize = GetDirectoryFileSize(files[i]); //ここでエラー
ここでいう『filed[i]』も《string 型》を渡していることになります。

ところが、GetDirectoryFileSize の実装を見ると
> public static long GetDirectoryFileSize(DirectoryInfo hDirectoryInfo)
のように、引数は《string 型》ではなく《DirectoryInfo 型》が要求されています。
これがエラーの理由です。


(対策案1)呼び出し側で対処する。
 具体的には、Main 側のコードを修正するという事です。
 GetDirectoryFileSize に string を渡すのではなく、
 DirectoryInfo を渡すようにします。

ヒント:
 ファイルパスを表す string から、FileInfo を作るためのコードは
 既に書かれていますよね。同じようにして、ディレクトリパスを表す
 string から、DirectoryInfo を作ってやれば OK です。


(対策案2)呼び出される側で対処する。
 この場合、Main 側のコードは修正しません。
 GetDirectoryFileSize メソッド側のコードを修正して、
 引数の型を string で受けるようにします。

ヒント:
 再帰呼び出しのために、結局は DirectoryInfo への変換は必要なので
 その意味では、最終的には対策案1と変わりませんが、この方針を採る場合、
 GetDirectoryFileSize(string) と GetDirectoryFileSize(DirectoryInfo) の
 2 種類の実装を用意しておく(オーバーロードと呼ばる方式)のも良いでしょう。
引用返信 編集キー/
■74975 / inTopicNo.3)  Re[2]: ディレクトリのサイズを求める。(初歩的な質問だと思います)
□投稿者/ にゃー。 (2回)-(2015/02/14(Sat) 16:14:55)
そういうことだったんですね。
ようやく解決しました、こんな初歩的な質問に答えてくれてありがとうございます!


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


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

このトピックに書きこむ

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

管理者用

- Child Tree -