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の次の列
(サブアイテム)に追加していきたいのです。
なにが/どのように「上手くいきません」なのかを説明してください。
ファイル名とそのサイズとを組みにしたいのなら
SortedList<String^,int>^ かなにかに放り込めばいいんじゃないんすか?
>上手くいきません
とは?
ListViewItemクラスを使って、ItemsにAddしてゆけばどうでしょうか?
ちなみにVB.NETですが
http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard25.htm
が参考になるでしょう。
アドバイスありがとうございます。
上手くいかなかったのは
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;としても同じでした。
>a = hFileInfo->Length;
>LI->SubItems->Add(a[i].ToString() + KB);
変数を使わないで、
LI->SubItems->Add(hFileInfo->Length.ToString() + KB);
ではだめだったのでしょうか?
ちなみに変数を使うのであれば、配列ではないはずなので
Int64 len = hFileInfo->Length;
でしょうかね。
あ、すみません。
配列として別に取っておきたいってことだったのですね。
だったら
>array<long>^a;
は
array<Int64>^ a;
とし、
>for(i=0;i<index;i++){
の直前に配列を作成
a = gcnew array<Int64>(index);
代入は
>a = hFileInfo->Length;
ではなく
a[i] = hFileInfo->Length
とします。
連ちゃんですが、ファイルサイズ取得も考えているのであれば
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
Blueさん
いつも親切な解説ありがとうございます。意図した動作にすることが出来ました!
ところでこの手のサンプルプログラムを見るとFor文ではなくFor eachで回していること
が多いのですがどちらの方がベターなのでしょうか?
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変数は使用できないようです。
>for each (FileInfo^ fi in di->GetFiles)
for each (FileInfo^ fi in di->GetFiles())
>for each (FileInfo^ fi in di->GetFiles())
すみません、見落としておりました。お恥ずかしい・・・。
こうしたリストに追加する処理はFor文よりもFor Each文の方が楽に出来るのですね。
わざわざ配列を使用しなくても出来そうですし。大変参考になりました。まだまだ初心
者のためいろいろと学んで行きたいと思います。