ファイルサイズの取得について – プログラミング – Home

ファイルサイズの取得について
 
通知
すべてクリア

[解決済] ファイルサイズの取得について


test
 test
(@test)
ゲスト
結合: 18年前
投稿: 28
Topic starter  

VC++/CLRです。

下記のプログラムではあるディレクトリ内のファイルを取得しファイル名をListViewへ
表示させています。

array<String^>^strFileName;

ListViewItem^ LI = gcnew ListViewItem();

//フォルダ内のファイルを取得し配列に格納
strFileName = System::IO::Directory::GetFiles(フォルダ名);

//フォルダ内のファイル数を取得
index = strFileName->Length;

//ファイルが1つ以上ある場合
if(index > 0)
{
for(i=0;i<index;i++){

//ファイルの数分ListViewに追加
LI = listView1->Items->Add(System::IO::Path::GetFileName(strFileName[i])-
>ToLower());

}

}

上記と同じように今度は上記のファイルのサイズを取得してListViewに追加したいので
すが上手くいきません。ご教授お願いします。

ファイルサイズは

System::IO::FileInfo^ hFileInfo = gcnew System::IO::FileInfo(ファイル名);
long a = hFileInfo->Length;

で取得出来ました。

やりたいことは上記のFor文の中で一緒にファイルサイズも取得してListViewの次の列
(サブアイテム)に追加していきたいのです。


引用未解決
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

なにが/どのように「上手くいきません」なのかを説明してください。

ファイル名とそのサイズとを組みにしたいのなら
SortedList<String^,int>^ かなにかに放り込めばいいんじゃないんすか?


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

>上手くいきません
とは?

ListViewItemクラスを使って、ItemsにAddしてゆけばどうでしょうか?

ちなみにVB.NETですが
http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard25.htm
が参考になるでしょう。


返信引用
test
 test
(@test)
ゲスト
結合: 18年前
投稿: 28
Topic starter  

アドバイスありがとうございます。

上手くいかなかったのは

array<long>^a;

とロング型の配列を宣言して

//ファイルが1つ以上ある場合
if(index > 0)
{
 for(i=0;i<index;i++){

  //ファイルの数分ListViewに追加
  LI = listView1->Items->Add(System::IO::Path::GetFileName(strFileName[i])-
>ToLower());

System::IO::FileInfo^ hFileInfo = gcnew System::IO::FileInfo(strFileName
[i]);

  a = hFileInfo->Length;

  LI->SubItems->Add(a[i].ToString() + KB);
 }

}

For文の中にファイルサイズ取得ロジックを入れたのですがこの時点でリビルド時に

__int64' から 'cli::array<Type> ^' に変換できません。とエラーになりました。

hFileInfo->Lengthの戻り値が__int64型のようで__int64はどのように配列を宣言すれば
よいかが分かりません。array<int>^a;としても同じでした。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

>a = hFileInfo->Length;
>LI->SubItems->Add(a[i].ToString() + KB);

変数を使わないで、

LI->SubItems->Add(hFileInfo->Length.ToString() + KB);

ではだめだったのでしょうか?

ちなみに変数を使うのであれば、配列ではないはずなので

Int64 len = hFileInfo->Length;

でしょうかね。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

あ、すみません。
配列として別に取っておきたいってことだったのですね。

だったら
>array<long>^a;

array<Int64>^ a;
とし、

>for(i=0;i<index;i++){
の直前に配列を作成

a = gcnew array<Int64>(index);

代入は
>a = hFileInfo->Length;
ではなく
a[i] = hFileInfo->Length

とします。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

連ちゃんですが、ファイルサイズ取得も考えているのであれば

DirectoryInfo.GetFiles

を使ったほうが便利でしょう。

DirectoryInfo^ di = gcnew DirectoryInfo(c:\\);

for each (FileInfo^ fi in di->GetFiles)
{
ListViewItem^ li = listView1->Items->Add(fi->Name);
li->SubItems->Add(fi->Length.ToString() + byte); // KBではないはず
}

FileInfo.Length プロパティ
http://msdn2.microsoft.com/ja-jp/library/system.io.fileinfo.length(VS.80).aspx


返信引用
test
 test
(@test)
ゲスト
結合: 18年前
投稿: 28
Topic starter  

Blueさん

いつも親切な解説ありがとうございます。意図した動作にすることが出来ました!
ところでこの手のサンプルプログラムを見るとFor文ではなくFor eachで回していること
が多いのですがどちらの方がベターなのでしょうか?


返信引用
test
 test
(@test)
ゲスト
結合: 18年前
投稿: 28
Topic starter  

DirectoryInfo^ di = gcnew DirectoryInfo(c:\\);

for each (FileInfo^ fi in di->GetFiles)
{
ListViewItem^ li = listView1->Items->Add(fi->Name);
li->SubItems->Add(fi->Length.ToString() + byte); // KBではないはず
}


for each (FileInfo^ fi in di->GetFiles)

for each ステートメントは、型 'overloaded-function' の変数で操作できません

'overloaded function変数は使用できないようです。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

>for each (FileInfo^ fi in di->GetFiles)
for each (FileInfo^ fi in di->GetFiles())


返信引用
test
 test
(@test)
ゲスト
結合: 18年前
投稿: 28
Topic starter  

>for each (FileInfo^ fi in di->GetFiles())

すみません、見落としておりました。お恥ずかしい・・・。

こうしたリストに追加する処理はFor文よりもFor Each文の方が楽に出来るのですね。
わざわざ配列を使用しなくても出来そうですし。大変参考になりました。まだまだ初心
者のためいろいろと学んで行きたいと思います。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました