ウォーターサーバーとコーヒーマシンが一体化した画期的マシン >>

For Each strFileName As String In Directory.GetFiles("フォルダ名","*.TXT")
'なにか処理
Next strFileName


としてファイル名を読み込んで処理する場合、ファイル名でソートされて順番に出てくるような気がします。
どのような基準でソートされるのかを調べているのですが、はっきり明記されているものが見つかりません。

安心して使うために裏付けがほしいのですが、どこかに詳細な資料はないでしょうか?
よろしくお願いします。

A 回答 (3件)

ファイルシステムによって結果が異なる可能性がありますが(ファイルシステムドライバの動作に依存するため)、FATとNTFSについていえば、どちらもディスク上に格納されているファイルのリスト(FATではディレクトリエントリ、NTFSではマスターファイルテーブル=MFT)に書かれている順番でファイル名が返されます。



FATの場合、書かれる順番は不定です。(後から書き込んだファイルが最後に書かれる、というのは間違いです。)

NTFSの場合、MFTに格納されるリストはファイル名順にソートされているので、「書かれている順番」で返された一覧はソートされていることになります。

ちょっと時間がないので、今のところはこのくらいで。
    • good
    • 0
この回答へのお礼

FATの場合はよく分からない順番だぞ、とゆうことで納得しておきます。
回答ありがとうございました。

お礼日時:2005/09/21 18:53

ファイル名をSystem.Collections.ArrayListなどに取り込み、ソートした後


処理を実行した方が、色々調べるよりも早くて簡単な気がします。
    • good
    • 0
この回答へのお礼

おお、ArrayListですね!
これなら不定量な今回の内容でも使えそうです。
ちょっと手順は増えますが、念のためこれでソートしておきます。
ありがとうございました。

お礼日時:2005/09/21 18:42

内部的に FindFirstFile / FindNextFile を使っているようだけど


http://www.microsoft.com/japan/msdn/net/general/ …

取得する順番は..
http://forums.belution.com/ja/vc/000/038/23.shtml

なるほど!

正式情報は
http://msdn.microsoft.com/library/en-us/fileio/f …

The order in which this function returns the file names is dependent on the file system type. With the NTFS file system and CDFS file systems, the names are returned in alphabetical order. With FAT file systems, the names are returned in the order the files were written to the disk, which may or may not be in alphabetical order.
    • good
    • 0
この回答へのお礼

NTFSの場合はファイル名順のようですね。
参照先はサーバーの決まったフォルダなので、今回はこのまま使っても大丈夫そうです。
参考サイトの情報も参考になりました。
ありがとうございました。

お礼日時:2005/09/21 18:38

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qフルパスから最後のディレクトリ名を取得したい。

vb.netなのですが、例えば
c:\aaa\bbb\ccc\ddd\eee\fff.exe
というフルパスがあったとして、
eeeというディレクトリ名を取得したいのですが、
何か良い方法はないでしょうか。
それぞれのディレクトリ名の文字数や階層数は
決まっていないのですが、オススメの方法が
ありましたら、教えて頂けると助かります。

Aベストアンサー

MessageBox.Show(IO.Path.GetFileName(IO.Path.GetDirectoryName(myPath)))

IO.Path の GetDirectoryName でフォルダのフルパスを取得して、さらに IO.Path の GetFileName で最終フォルダ(またはファイル)の名前を取得。

QCloseとDisposeの違い

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、タイマーコントロールのイベントに記述していますと、それは実行され続けます。

これを防ぐために、Me.Dispose() を使います。すると、きれいにプロセスは終了し、イベントは発生しない模様です。

そこで、「フォームを閉じる」意味のMe.Close() をすべてMe.Dispose() に変えてしまいました。確実にプロセスを破棄出来ると思ったからです。Webで調べると、違いは「再利用できる、できないの違い」という答えがありましたが、それはきっと、ファイルやオブジェクトのことで、フォームの場合は、再びShowまたはShowDialogで表示させることは可能でしたので、特に問題は感じていませんでした。

ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。Me.Close() に変えるとうまくいきました。

わけわからなくなってきました。。。

ちなみに、その残ったフォームは、スタートアップフォームであり、別のフォームからShowまたはShowDialogメソッドで呼び出したものではありません。

ここで4つの仮説を立ててみました。

1. ShowDialogで呼び出したフォームは、Me.Dispose()、Showで呼び出した、あるいは、スタートアップフォームは、Me.Close() すれば破棄できる

2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

3. 呼び出し方ではなく、別の要因が存在する

4. 併記する必要がある場合がある

Me.Close()
Me.Dispose()

または、

Me.Dispose()
Me.Close()



どれが正しいのでしょうか?どなたがご存じの方がいらっしゃいましたら、ご教授いただけませんでしょうか? どうぞよろしくお願い申し上げます。ありがとうございました。

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、...続きを読む

Aベストアンサー

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。
Me.Close() に変えるとうまくいきました。

通常はどちらでもうまくいきます。

>2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

ShowDialogの場合は、メソッド内部で、ハンドルが破棄されているため、Close()メソッドの際にDispose()メソッドが呼び出されます。

>3. 呼び出し方ではなく、別の要因が存在する

そう思います。

>4. 併記する必要がある場合がある

インスタンスを明示的に破棄したほうがよい場合は多く存在します。
Disposeが使えるメンバはIDisposableをインターフェースとして持っているメンバです。
これらのメンバは、外部とのやり取りを行うものが多くあります。
たとえばSQLClientに含まれるようなメンバです。

外部とのコネクションを確実に破棄を保障してほしいなどという場合がありますよね、このようなときに使用します。

Using構文を使用するのとまったく同じ理由になります。
正確にはUsing構文を使用できるメンバには条件があります、IDisposableをインターフェースとして持っているメンバに限るというものです。

ほかにもガーベージコレクタによるファイナライズを伴うかどうかという違いがあります。
Disposeの場合はファイナライズが同時に行われるため、使用していたメモリ空間を開放することができます。

上記のような理由により、
Me.Close()
Me.Dispose()
は両方書いたほうがよいと思います。

蛇足ですが、
Me.Dispose()
Me.Close()
はエラーになります。
Me.Dispose()により、Me本体(インスタンス)は削除されてしまいます。
存在しないMeに対してCloseメソッドを要求することはできないためです。

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリ...続きを読む

Qフォルダの中の特定のファイルを取得

(VB.NET)
Dim files As String() = System.IO.Directory.GetFiles("C:\aaa", "*", System.IO.SearchOption.AllDirectories)
ListBox1.Items.AddRange(files)

上記のコードでは"C:\aaa"以下のすべてのファイルを取得しますが、
例えばGetFilesメソッドの2番目のパラメータに
"*.(html|htm)"などと指定して(この場合は無理でしたが)"C:\aaa"以下の拡張子が「html」または「htm」のファイルを取得するにはどうすればよいでしょうか。
"*.html"のように1種類の場合はできるのですが…。

Aベストアンサー

GetFilesで取得した配列を独自に処理してやればいいのでは

for each ss as string in files
  dim fi as new IO.FileInfo(ss)
  dim ext as String = fi.Extention.ToLower
  ' このextとの比較を工夫すれば別の種類のファイルでも対処可能
  if ext = ".html" or ext = ".htm" then
    ListBox1.Items.add( ss )
  end if
next

といった具合で ...

Qフォルダ内の、最新のタイムスタンプのファイルを1つだけ取り出す(VBscript)

フォルダ内に複数のファイルが存在しており、その中でタイムスタンプが一番最新のファイルをコピーしたいと考えているのですが、ファイル同士のタイムスタンプを比較する方法が見つけられませんでした。どなたかご存知の方がいらっしゃいましたら、教えて頂けませんか?

Aベストアンサー

私が書いたスクリプトの後ろにkhaii21さんが書き足されたんですよね?

不思議ですねぇ。本当に書かれたものそのままなら、
>strNewFileName2 = objFile.Name

この行通るはず無いんですけど。
strNewFileName2、空のままのはずです。

通らない理由は、
>If dtmMostNewTimeStamp < objFile.DateLastModified Then

です。dtmMostNewTimeStampより新しいファイル、strNewFileName以外であるわけ無いですよね。


と、khaii21さんが書かれたスクリプトについて解説してみましたが、2番目に新しいファイルを見つけるのに列挙しなおす必要なんて無いですよ(^^;;;


私が書いたスクリプト、ちょっと直すだけで1番目と2番目両方取れます。

Dim strNewFileName
Dim dtmMostNewTimeStamp

Dim strNewFileName2
Dim dtmMostNewTimeStamp2

'ファイルを列挙
For Each objFile In objFolder.Files

If dtmMostNewTimeStamp < objFile.DateLastModified Then

dtmMostNewTimeStamp2 = dtmMostNewTimeStamp
strNewFileName2 = strNewFileName

dtmMostNewTimeStamp = objFile.DateLastModified
strNewFileName = objFile.Name

ElseIf dtmMostNewTimeStamp2 < objFile.DateLastModified Then

dtmMostNewTimeStamp2 = objFile.DateLastModified
strNewFileName2 = objFile.Name

End If

Next

考え方は、列挙したファイルが今までで一番新しかったら
・前の1番目→2番目
・列挙されたファイル→1番目
に、

1番目より古いけど、それまでの2番目よりは新しければ、

・前の1番目→そのまま1番目
・列挙されたファイル→2番目

になりますよね。

私が書いたスクリプトの後ろにkhaii21さんが書き足されたんですよね?

不思議ですねぇ。本当に書かれたものそのままなら、
>strNewFileName2 = objFile.Name

この行通るはず無いんですけど。
strNewFileName2、空のままのはずです。

通らない理由は、
>If dtmMostNewTimeStamp < objFile.DateLastModified Then

です。dtmMostNewTimeStampより新しいファイル、strNewFileName以外であるわけ無いですよね。


と、khaii21さんが書かれたスクリプトについて解説してみましたが、2番目に新しいファ...続きを読む

QC# GetFilesで複数のファイルの種類を開きたい。

C# GetFilesで複数のファイルの種類を開きたい。

Directory.GetFiles(path, "*.jpg|*.tif");
としたのですが、エラーが出てしまいます。
正規表現の使い方が間違っているのでしょうか?
それともGetFilesでは複数の種類のファイルは取得できないのでしょうか?

アドバイスよろしくお願いいたします。

Aベストアンサー

/*

おそらく無理です。(やろうと思えば出来るかもしれないけど、やたら読みにくいコードになるはず。)

地道に二回やったほうが読みやすいコードになるでしょう。
*/

using System;
using System.IO;
using System.Collections.Generic;



namespace Q5930105
{
class MainClass
{
public static void Main (string[] args)
{
DirectoryInfo di = new DirectoryInfo("C:\\");
List<FileInfo> list = new List<FileInfo>();
list.AddRange(di.GetFiles("*.csv"));
list.AddRange(di.GetFiles("*.mid"));
list.ForEach(delegate(FileInfo fi){ System.Console.WriteLine(fi); });
System.Console.WriteLine("fin");
}
}
}

/*

おそらく無理です。(やろうと思えば出来るかもしれないけど、やたら読みにくいコードになるはず。)

地道に二回やったほうが読みやすいコードになるでしょう。
*/

using System;
using System.IO;
using System.Collections.Generic;



namespace Q5930105
{
class MainClass
{
public static void Main (string[] args)
{
DirectoryInfo di = new DirectoryInfo("C:\\");
List<FileInfo> list = new List<FileInfo>();
list.AddRange(di.GetFiles("*.csv"));
list.AddRange(di.GetFiles("*.mid"));
list.Fo...続きを読む

QDataGridViewで指定したセルの値を取得

こんにちは。

VB2008のDataGridViewで指定したセルの値を取得をする方法がわかりません。
どなたか教えてください。

Aベストアンサー

こんばんは.

 Dim Data As String
 Data = Me.DataGridView(0, 2).Value
 MsgBox(Data)

みたいな感じで取れないですかね???

QDataTableから条件を満たした行を別のDatatableへコピーしたい

VC#2005とSQLServer2005ExpressEditionでWindowsアプリケーションを作成しています。

データベースの中から1つのマスタテーブルのデータを呼び出すのにTableAdapterを使ってDataTableにデータをバインドしました。
そこから条件を満たしている行をすべて抽出して同じ型のDataTableにデータをコピーしたいのです。

ですから、DataTableは2つ用意しています。1つは上記の通りデータをバインドしていますが、もう1つは宣言しただけなのでまだ空っぽの状態です。
DataTableにはカラムが3列あり、その中の1列をグループIDとしています。
条件としてはグループIDが同じであるということです。
やりたいことは条件を満たしている行をすべて抽出して空のデータテーブルにコピーすることです。

どなたかご存知の方いらっしゃれば教えてください。
よろしくお願いします。

Aベストアンサー

C#だったんですね … さほど変わりないと思いますが

お使いのコードが提示されていないのでこちらで適当な変数をでっち上げております
現在お使いのコードを支障の無い範囲で提示しましょう

//元のデータテーブルがdtSourceとすると
// テーブル構造をコピー
DataTable dt = dtSource.Clone();
DataRow r = null;
foreach( DataRow dtRow in dtSource.Select("選択するための文字列"))
{
  r = dt.NewRow();
  for( int n = 0; n < dtRow.ItemArray.Length; n++ )
  {
    r[n] = dtRow[n];
  }
  dt.Rows.Add( r );
}
といった具合になると思います

# 前回の投稿中のstSorceはdtSourceの単なるミスです

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分

QVB.NETのコンボボックスについて

VB6からVB.NETでプログラミングを始めました。
コンボボックスのクリアの仕方や設定の仕方、また
取り出し方等を教えて下さい。

色々とヘルプも見てみたのですが、よく解りません。
宜しくお願い致します。

Aベストアンサー

クリアだけだと思ってました。
追記します。

Itemを操作します


'登録
For i = 1 To 10
  Me.ComboBox1.Items.Add(i.ToString)
Next

'取得
For i = 0 To Me.ComboBox1.Items.Count - 1
  MsgBox(Me.ComboBox1.Items(i).ToString)
Next

'完全クリア
Me.ComboBox1.Items.Clear()

部分クリア
Me.ComboBox1.Items.RemoveAt(Index値)

QOracle(オラクル)で、日付時刻型の検索方法について

質問させていただきます。
データベースはオラクルを使っていて、
SQL文で、抽出するときにエラーが出て困っています。

日付時刻型が「2005/05/26 19:13:00」という感じで入ってます。
2005/05/26 を抽出したいのですが、
BETWEEN '2005/05/26 00:00:00' AND '2005/05/26 23:59:59'

だと、エラーでできません。
どなた様か、ご教授よろしくお願いしますm(_ _)m

Aベストアンサー

日付検索を行う場合は、以下のように書式を含める必要があります。

col BETWEEN TO_DATE('2005/05/26 00:00:00','YYYY/MM/DD HH24:MI:SS') AND TO_DATE('2005/05/26 23:59:59','YYYY/MM/DD HH24:MI:SS')

ただ、厳密には

col >= TO_DATE('2005/05/26', 'YYYY/MM/DD')
AND
col < TO_DATE('2005/05/27', 'YYYY/MM/DD')

と書くべきでしょうね。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング