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

わんくま同盟

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

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

ツリー一括表示

フォルダ名とその更新日時を一緒に収得 /なつ (18/09/08(Sat) 17:52) #88574
Re[1]: フォルダ名とその更新日時を一緒に収得 /Hongliang (18/09/08(Sat) 21:42) #88582
  └ Re[2]: フォルダ名とその更新日時を一緒に収得 /なつ (18/09/09(Sun) 08:19) #88585
    └ Re[3]: フォルダ名とその更新日時を一緒に収得 /Jitta (18/09/09(Sun) 08:45) #88586
      └ Re[4]: フォルダ名とその更新日時を一緒に収得 /なつ (18/09/10(Mon) 00:16) #88597
        └ Re[5]: フォルダ名とその更新日時を一緒に収得 /魔界の仮面弁士 (18/09/10(Mon) 03:48) #88598
          ├ Re[6]: フォルダ名とその更新日時を一緒に収得 /魔界の仮面弁士 (18/09/10(Mon) 10:19) #88600
          │└ Re[7]: フォルダ名とその更新日時を一緒に収得 /なつ (18/09/10(Mon) 19:50) #88608
          │  ├ Re[8]: フォルダ名とその更新日時を一緒に収得 /Hongliang (18/09/10(Mon) 20:27) #88609
          │  │└ Re[9]: フォルダ名とその更新日時を一緒に収得 /なつ (18/09/12(Wed) 21:18) #88641 解決済み
          │  ├ Re[8]: フォルダ名とその更新日時を一緒に収得 /Jitta (18/09/10(Mon) 22:12) #88610
          │  │└ Re[9]: フォルダ名とその更新日時を一緒に収得 /なつ (18/09/12(Wed) 21:21) #88642 解決済み
          │  └ Re[8]: フォルダ名とその更新日時を一緒に収得 /魔界の仮面弁士 (18/09/10(Mon) 23:42) #88613
          │    └ Re[9]: フォルダ名とその更新日時を一緒に収得 /なつ (18/09/12(Wed) 21:10) #88640 解決済み
          │      └ Re[10]: フォルダ名とその更新日時を一緒に収得 /魔界の仮面弁士 (18/09/13(Thu) 00:34) #88645 解決済み
          │        └ Re[11]: フォルダ名とその更新日時を一緒に収得 /なつ (18/09/13(Thu) 23:23) #88651 解決済み
          └ Re[6]: フォルダ名とその更新日時を一緒に収得 /Jitta (18/09/10(Mon) 10:15) #88599
            └ Re[7]: フォルダ名とその更新日時を一緒に収得 /とっちゃん (18/09/10(Mon) 10:23) #88601
              └ Re[8]: フォルダ名とその更新日時を一緒に収得 /Jitta (18/09/12(Wed) 21:57) #88644 解決済み
                └ Re[9]: フォルダ名とその更新日時を一緒に収得 /なつ (18/09/15(Sat) 10:09) #88653 解決済み


親記事 / ▼[ 88582 ]
■88574 / 親階層)  フォルダ名とその更新日時を一緒に収得
□投稿者/ なつ (5回)-(2018/09/08(Sat) 17:52:08)

分類:[VB.NET/VB2005 以降] 

2018/09/08(Sat) 17:53:26 編集(投稿者)

Windows 10、VB 2017 です。
またまた初歩的な質問ですみません。

あるフォルダ内に存在する、全てのフォルダ名とその更新日時を同時に収得するにはどのようにすれば良いのでしょうか?
あくまでも別々にではなく同時にての収得でお願いします。

[ □ Tree ] 返信 編集キー/

▲[ 88574 ] / ▼[ 88585 ]
■88582 / 1階層)  Re[1]: フォルダ名とその更新日時を一緒に収得
□投稿者/ Hongliang (695回)-(2018/09/08(Sat) 21:42:25)
同時というのがどれくらい同時でなければならないのかわかりませんが、
とりあえずDirectoryInfoを使えば用を足せませんか。
[ 親 88574 / □ Tree ] 返信 編集キー/

▲[ 88582 ] / ▼[ 88586 ]
■88585 / 2階層)  Re[2]: フォルダ名とその更新日時を一緒に収得
□投稿者/ なつ (6回)-(2018/09/09(Sun) 08:19:16)
2018/09/09(Sun) 08:21:05 編集(投稿者)

No88582 (Hongliang さん) に返信

ありがとうございます。

DirectoryInfoを使うのも分かるのですが、知りたいのはあるフォルダ内に存在する、全てのフォルダ名とその更新日時で、
しかも可能であれば "*.files" などとして "files" が付くフォルダのみを収得したいのです。
[ 親 88574 / □ Tree ] 返信 編集キー/

▲[ 88585 ] / ▼[ 88597 ]
■88586 / 3階層)  Re[3]: フォルダ名とその更新日時を一緒に収得
□投稿者/ Jitta (406回)-(2018/09/09(Sun) 08:45:44)
No88585 (なつ さん) に返信
> DirectoryInfoを使うのも分かるのですが、知りたいのはあるフォルダ内に存在する、全てのフォルダ名とその更新日時で、
> しかも可能であれば "*.files" などとして "files" が付くフォルダのみを収得したいのです。


やってみようとか、少なくとも、「調べてみよう」とは思わないのでしょうか。

「directoryinfo」で検索。
https://www.bing.com/search?q=directoryinfo&form=EDNTHT&mkt=ja-jp&httpsmsn=1&refig=b95f91b23d6542b5a8d56860eab8072b&PC=NMTS&sp=-1&pq=directoryinfo&sc=8-13&qs=n&sk=&cvid=b95f91b23d6542b5a8d56860eab8072b

Bing では、大抵一番最初に MSDN のサイトが来ます。

https://msdn.microsoft.com/ja-jp/library/f3e2f6e5.aspx
GetDirectories(string) メソッドで、「"*.files" などとして "files" がつくフォルダのみを取得」できます。

https://msdn.microsoft.com/ja-jp/library/system.io.directoryinfo.aspx
Name または FullName メンバーで、ディレクトリ名が取得できます。
LastWriteTime で最後に書き込みがなされた時刻、すなわち更新日時が取得できます。
[ 親 88574 / □ Tree ] 返信 編集キー/

▲[ 88586 ] / ▼[ 88598 ]
■88597 / 4階層)  Re[4]: フォルダ名とその更新日時を一緒に収得
□投稿者/ なつ (7回)-(2018/09/10(Mon) 00:16:00)
No88586 (Jitta さん) に返信

ありがとうございます。

お言葉を返すようですが、調べてもいますし試してもいるのですがそれでも分からなくてお尋ねもしているのです。

https://msdn.microsoft.com/ja-jp/library/system.io.directoryinfo.aspx
教えて頂いた↑のについては、正直どのように使えば良いのかは分かってはいませんが、
下記のようなことであれば動作確認もしています。
ただこれですとフォルダ名と更新日時の取得は別々にしなければなりませんが。

 'フォルダ名を取得
 Dim Directori As String() = System.IO.Directory.GetDirectories("C:\Users\○○○\○○○", "*", System.IO.SearchOption.AllDirectories)

 'フォルダ名 0番目の更新日時を取得
 Dim Directori_Update As DateTime = System.IO.File.GetLastWriteTime(Directori(0))

[ 親 88574 / □ Tree ] 返信 編集キー/

▲[ 88597 ] / ▼[ 88600 ] ▼[ 88599 ]
■88598 / 5階層)  Re[5]: フォルダ名とその更新日時を一緒に収得
□投稿者/ 魔界の仮面弁士 (1836回)-(2018/09/10(Mon) 03:48:06)
No88597 (なつ さん) に返信
> 調べてもいますし試してもいるのですが
どこまで分かっているのか、調べた範囲までを
今回のように提示していただけると助かります。


同時とは言いますが、かつての TxF (トランザクションNTFS) のような仕組みでもない限り、
列挙操作中に、更新や削除が行われる可能性は否定できないと思います。
ドライブごと排他ロックするわけにもいかないでしょうから、
どこまでの同時性を求めているのかが、最初の質問からは読み取れませんでした。



> Dim Directori As String() = System.IO.Directory.GetDirectories("C:\Users\○○○\○○○", "*", System.IO.SearchOption.AllDirectories)
> Dim Directori_Update As DateTime = System.IO.File.GetLastWriteTime(Directori(0))
System.IO.Directory.GetDirectories は戻り値が配列であるがゆえに、
すべてを列挙し終えるまで、結果が返却されません。

その意味においては、System.IO.Directory.EnumerateDirectories の方が都合が良いでしょう。
 Dim x As IEnumerable(Of String) = Directory.EnumerateDirectories(strFolder, "*", SearchOption.AllDirectories)

こちらは順次列挙ですので、直ちに検索結果の返却が始まりますので、
For Each あるいは LINQ での処理との相性も良いかと思います。


さらに言えば、System.IO.Directory クラスだと、列挙されるのはあくまでパス名だけですので、
これを System.IO.DirectoryInfo クラスに置き換えることで、さらに効率が良くなります。
 Dim y = New System.IO.DirectoryInfo(strFolder).EnumerateDirectories("*", SearchOption.AllDirectories)


とはいえいずれの方法であっても、先に述べた通り、列挙操作中の外部からの更新や削除は防げません。
また AllDirectories 指定の場合、下位のディレクトリでアクセス権の無いパスがあると
UnauthorizedAccessException 例外等により、処理が中断されてしまうことになります。

アクセス権の無いパスをスキップして処理する必要がある場合は、
 Public Iterator Function EnumAllDir(dirPath As DirectoryInfo) As IEnumerable(Of DirectoryInfo)
といったメソッドを自作して、その中で TopDirectoryOnly 指定で Try〜Catch しながら
再帰的に列挙した方が良いかも知れません。
[ 親 88574 / □ Tree ] 返信 編集キー/

▲[ 88598 ] / ▼[ 88608 ]
■88600 / 6階層)  Re[6]: フォルダ名とその更新日時を一緒に収得
□投稿者/ 魔界の仮面弁士 (1837回)-(2018/09/10(Mon) 10:19:47)
No88598 (魔界の仮面弁士) に追記
> System.IO.Directory クラスだと、列挙されるのはあくまでパス名だけですので、
> これを System.IO.DirectoryInfo クラスに置き換えることで、さらに効率が良くなります。


おぉっと…? No88585 の時点で、DirectoryInfo を使うことは検討済みだったのですね。
>> DirectoryInfoを使うのも分かるのですが

でも何故か、 No88597 の時点では DirectoryInfo を用いていないようですが、
DirectoryInfo でも AllDirectories 指定はできるようになっているはずですよ。


ただし、ターゲット フレームワークを .NET Framework 2.0/3.0/3.5 にしている場合は、
IEnumerable(Of ) を返す Enumerate〜系メソッドが使えず、
配列を返す Get〜系メソッドに頼ることになります。
 

.NET 1.0 以上
  Directory.GetDirectories(String) 静的メソッド
  Directory.GetDirectories(String, SearchOption) 静的メソッド
  DirectoryInfo.GetDirectories() インスタンス メソッド
  DirectoryInfo.GetDirectories(String) インスタンス メソッド


.NET 2.0 以上
  Directory.GetDirectories(String, String, SearchOption) 静的メソッド
  DirectoryInfo.GetDirectories(String, SearchOption) インスタンス メソッド


.NET 4.0 以上
  Directory.EnumerateDirectories(String) 静的メソッド
  Directory.EnumerateDirectories(String, String) 静的メソッド
  Directory.EnumerateDirectories(String, String, SearchOption) 静的メソッド
  DirectoryInfo.EnumerateDirectories(String) インスタンス メソッド
  DirectoryInfo.EnumerateDirectories(String, SearchOption) インスタンス メソッド
[ 親 88574 / □ Tree ] 返信 編集キー/

▲[ 88600 ] / ▼[ 88609 ] ▼[ 88610 ] ▼[ 88613 ]
■88608 / 7階層)  Re[7]: フォルダ名とその更新日時を一緒に収得
□投稿者/ なつ (8回)-(2018/09/10(Mon) 19:50:43)
No88600 (魔界の仮面弁士 さん) に返信

ありがとうございます。
既に頭の中は混乱状態、思ってたよりは随分とややっこしいのですね。

 Dim x As IEnumerable(Of String) = System.IO.Directory.EnumerateDirectories("C:\Users\○○○\○○○\SONY NNC\SNNC30", "*", System.IO.SearchOption.AllDirectories)
 Dim y = New System.IO.DirectoryInfo("C:\Users\○○○\○○○\SONY NNC\SNNC30").EnumerateDirectories("*", System.IO.SearchOption.AllDirectories)

合ってるかどうかは分かりませんが作ってはみました。
ただ疑問なのは、x は 同じString でありながらも、何故か ListBox1.Items.AddRange(x) とは出来ないのかです。

NET Framework は4.0のようです。

[ 親 88574 / □ Tree ] 返信 編集キー/

▲[ 88608 ] / ▼[ 88641 ]
■88609 / 8階層)  Re[8]: フォルダ名とその更新日時を一緒に収得
□投稿者/ Hongliang (696回)-(2018/09/10(Mon) 20:27:36)
> Dim x As IEnumerable(Of String) = System.IO.Directory.EnumerateDirectories("C:\Users\○○○\○○○\SONY NNC\SNNC30", "*", System.IO.SearchOption.AllDirectories)
> Dim y = New System.IO.DirectoryInfo("C:\Users\○○○\○○○\SONY NNC\SNNC30").EnumerateDirectories("*", System.IO.SearchOption.AllDirectories)

DirectoryInfoを使うのでしたら、Directory.EnumerateDirectories/GetDirectoriesを使用する意味はありません(それこそ「同時」でなくなってしまします)。
yに含まれる個々のDirectoryInfoオブジェクトが、ディレクトリのパスや更新日時を含んでいます。
対象が自分の制御下にあるディレクトリで全部のディレクトリを取得する処理のコストを計算でき、読み取ったのを全部ListBoxに突っ込むような処理であれば、EnumerateDirectoriesよりもGetDirectoriesの方が配列で返されるので楽かもしれません。

> ただ疑問なのは、x は 同じString でありながらも、何故か ListBox1.Items.AddRange(x) とは出来ないのかです。
ListBox::ItemsはListBox.ObjectCollection型です。
https://msdn.microsoft.com/ja-jp/library/system.windows.forms.listbox.items(v=vs.100).aspx
そしてListBox.ObjectCollectionクラスのAddRangeメソッドが取れる引数はObject配列型またはListBox.ObjectCollection型のみです。
https://msdn.microsoft.com/ja-jp/library/z018s5az(v=vs.100).aspx
https://msdn.microsoft.com/ja-jp/library/39cdcdw5(v=vs.100).aspx
String配列はObject配列として扱えるというやや特殊なルールがあるので、String配列は直接AddRangeに渡せますが、IEnumerable(Of String)はObject配列として扱えないのでAddRangeには渡せません。
[ 親 88574 / □ Tree ] 返信 編集キー/

▲[ 88609 ] / 返信無し
■88641 / 9階層)  Re[9]: フォルダ名とその更新日時を一緒に収得
□投稿者/ なつ (12回)-(2018/09/12(Wed) 21:18:02)
No88609 (Hongliang さん) に返信

ありがとうございます。
難解な部分もありますが自分なりに検証してみます。

解決済み
[ 親 88574 / □ Tree ] 返信 編集キー/

▲[ 88608 ] / ▼[ 88642 ]
■88610 / 8階層)  Re[8]: フォルダ名とその更新日時を一緒に収得
□投稿者/ Jitta (408回)-(2018/09/10(Mon) 22:12:29)
No88608 (なつ さん) に返信
> NET Framework は4.0のようです。

4.0 のサポートは終了しています。今後、セキュリティインシデントが見つかっても修正されません。
VS2017 なら、アップデートすることを勧めます。
[ 親 88574 / □ Tree ] 返信 編集キー/

▲[ 88610 ] / 返信無し
■88642 / 9階層)  Re[9]: フォルダ名とその更新日時を一緒に収得
□投稿者/ なつ (13回)-(2018/09/12(Wed) 21:21:06)
No88610 (Jitta さん) に返信

はい、そのようにします。

解決済み
[ 親 88574 / □ Tree ] 返信 編集キー/

▲[ 88608 ] / ▼[ 88640 ]
■88613 / 8階層)  Re[8]: フォルダ名とその更新日時を一緒に収得
□投稿者/ 魔界の仮面弁士 (1840回)-(2018/09/10(Mon) 23:42:40)
No88608 (なつ さん) に返信
> 既に頭の中は混乱状態、思ってたよりは随分とややっこしいのですね。

No88585 の時点で、DirectoryInfo にどういうメンバーが含まれているかは調査済みで、
それでも調査しきれなかったという点についても、追加質問に対して、短いコード例を
つけて回答したので、それで分かってもらえるものと思い込んでいました。反省。


DirectoryInfo にどんなメンバーがあるかは、DataGridView に渡すことで一覧できます。
DirectoryInfo のプロパティに、日付情報も同時に記録されていることが一望できるかと。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  Dim sDir As String = "C:\Users\○○○\○○○\SONY NNC\SNNC30"
  DataGridView1.DataSource = New DirectoryInfo(sDir).GetDirectories("*", SearchOption.AllDirectories)
End Sub


上記では、コントロールに表示するために GetDirectories を使いましたが、
No88598 でも述べたように、 EnumerateDirectories を使って LINQ や For Each での
順次列挙を行うこともできます。


Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
 Dim sDir As String = "C:\Users\○○○\○○○\SONY NNC\SNNC30"
 For Each di In New DirectoryInfo("C:\TEST").EnumerateDirectories("*", SearchOption.AllDirectories)
   Debug.WriteLine($"作成={di.CreationTime}, 更新={di.LastWriteTime}, パス={di.FullName}")
 Next
End Sub

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
 Dim sDir As String = "C:\Users\○○○\○○○\SONY NNC\SNNC30"
 For Each di In New DirectoryInfo("C:\TEST").GetDirectories("*", SearchOption.AllDirectories)
   Debug.WriteLine($"作成={di.CreationTime}, 更新={di.LastWriteTime}, パス={di.FullName}")
 Next
End Sub

Button2 は EnumerateDirectories による列挙、
Button3 は GetDirectories による列挙にしてあります。

いずれも Debug.WriteLine により、「イミディエイト」ウィンドウもしくは「出力」ウィンドウに
作成日時、更新日時、ディレクトリ名を列挙するだけの処理です。


sDir に、フォルダ数が多いパスを与えてみてください。
EnumerateDirectories ではすぐに列挙が始まるのに、
GetDirectories では列挙開始まで時間がかかってしまいます。


また、sDir に "C:\Windows" などを与えると、アクセス権の問題から
例外で停止してしまうことになります。これが No88598 で述べていた注意点です。
>> UnauthorizedAccessException 例外等により、処理が中断されてしまうことになります。



> Dim x As IEnumerable(Of String) = System.IO.Directory.EnumerateDirectories("C:\Users\○○○\○○○\SONY NNC\SNNC30", "*", System.IO.SearchOption.AllDirectories)
> ただ疑問なのは、x は 同じString でありながらも、
同じ…では無いですよね?
x の型は「String」でも「String()」でもなく、「IEnumerable(Of String)」なのですから。



> 何故か ListBox1.Items.AddRange(x) とは出来ないのかです。
AddRange メソッドの引数に渡せる型は「Object()」だからですね。
(Hongliang さんの回答にあるとおり、もう一つのオーバーロードもありますが)

でもって、IEnumerable(Of String) は一次元配列ではありませんから、
Object() に変換することができません。ゆえに、AddRange には渡せないということです。


配列化するために『ListBox1.Items.AddRange(x.ToArray())』のように呼べば渡せますが、
それなら最初から、EnumerateDirectories ではなく GetDirectories を使えば済みますね。


ただし LINQ で再加工するような処理においては、EnumerateDirectories の方が良いでしょう。


Dim q = From di In New DirectoryInfo(sDir).EnumerateDirectories("*", SearchOption.AllDirectories)
    Select $"作成={di.CreationTime}, 更新={di.LastWriteTime}, パス={di.FullName}"

ListBox1.Items.AddRange(q.ToArray())



> NET Framework は4.0のようです。
NET ではなく .NET (ドットネット) ですね。

Jitta さんの回答に補足して、.NET Framework のライフサイクルの表を載せておきます。
(.NET Framework 4 / 4.5 / 4.5.1 のサポートは、2016 年 1 月 12 日で終了しています)


4.7.2 → 2018/02/05 ライフサイクル開始、サポート中(OS のサポート期限まで)★現在の最新版★
4.7.1 → 2017/10/17 ライフサイクル開始、サポート中(OS のサポート期限まで)
4.7  → 2017/04/05 ライフサイクル開始、サポート中(OS のサポート期限まで)
4.6.2 → 2016/08/02 ライフサイクル開始、サポート中(OS のサポート期限まで)
4.6.1 → 2015/11/30 ライフサイクル開始、サポート中(OS のサポート期限まで)
4.6  → 2015/07/20 ライフサイクル開始、サポート中(OS のサポート期限まで)
4.5.2 → 2014/05/05 ライフサイクル開始、サポート中(OS のサポート期限まで)
4.5.1 → 2013/09/07 ライフサイクル開始、2016/01/12 で既にサポート切れ
4.5  → 2012/08/05 ライフサイクル開始、2016/01/12 で既にサポート切れ
4.0  → 2010/03/31 ライフサイクル開始、2012/03/04 Update 3(4.0.3)、2016/01/12 で既にサポート切れ
3.5  → 2007/11/19 ライフサイクル開始、2008/11/18 Service Pack 1(3.5.1)、サポート中(OS のサポート期限まで)
3.0  → 2006/11/19 ライフサイクル開始、2008/08/12 Service Pack 2、2011/07/12 で既にサポート切れ
2.0  → 2005/11/07 ライフサイクル開始、2009/01/16 Service Pack 2、2011/07/12 で既にサポート切れ
1.1  → 2003/04/01 ライフサイクル開始、2004/09/09 Service Pack 1、2013/10/08 で既にサポート切れ
1.0  → 2002/01/05 ライフサイクル開始、2004/09/09 Service Pack 3、2009/07/14 で既にサポート切れ

※ライフサイクルの開始日は、リリース日とは異なります。


4.7.2 を同梱している OS → Windows 10 ver1803
4.7.1 を同梱している OS → Windows 10 ver1709
4.7  を同梱している OS → Windows 10 ver1703
4.6.2 を同梱している OS → Windows 10 ver1607
4.6.1 を同梱している OS → Windows 10 ver1511
4.6  を同梱している OS → Windows 10 ver1507
4.5.2 を同梱している OS → なし
4.5.1 を同梱している OS → Windows 8.1
4.5  を同梱している OS → Windows 8
4.0  を同梱している OS → なし
3.5.x を同梱している OS → Vista 〜 Windows 10
3.0  を同梱している OS → Vista 〜 Windows 10
2.0  を同梱している OS → Vista 〜 Windows 10
1.1  を同梱している OS → なし
1.0  を同梱している OS → なし
[ 親 88574 / □ Tree ] 返信 編集キー/

▲[ 88613 ] / ▼[ 88645 ]
■88640 / 9階層)  Re[9]: フォルダ名とその更新日時を一緒に収得
□投稿者/ なつ (11回)-(2018/09/12(Wed) 21:10:23)
No88613 (魔界の仮面弁士 さん) に返信

ありがとうございます。

> それで分かってもらえるものと思い込んでいました。反省。
こちらこそすみません。何分この程度の知識しかないんです(汗)

Button1は、なぜか下記のエラー入力なってしまい解決策を見つけることも出来ませんでした。
> エラー BC30451 'DataGridView1' は宣言されていません。アクセスできない保護レベルになっています。

Button3は、何故かはいつまで経っても反応がなしとも。

いずれにしても、それらとは関係なくButton2を使わせていただきます。
何故なら希望とも叶ってるからです。
ありがとうございます。

> ただし LINQ で再加工するような処理においては、EnumerateDirectories の方が良いでしょう。
そのようなこともあるのでうね。
ListBox1.Items.AddRange(x.ToArray()) 有難く使わせていただきます。

> NET ではなく .NET (ドットネット) ですね。
はい、そうでしたね(汗)

それにしてもこれだけのバージョンがあるのすね。
早速、現在の最新版にします。
解決済み
[ 親 88574 / □ Tree ] 返信 編集キー/

▲[ 88640 ] / ▼[ 88651 ]
■88645 / 10階層)  Re[10]: フォルダ名とその更新日時を一緒に収得
□投稿者/ 魔界の仮面弁士 (1842回)-(2018/09/13(Thu) 00:34:59)
No88640 (なつ さん) に返信
> Button1は、なぜか下記のエラー入力なってしまい解決策を見つけることも出来ませんでした。
>>エラー BC30451 'DataGridView1' は宣言されていません。アクセスできない保護レベルになっています。

Form に Button1 は貼ったけれども、DataGridView1 は貼っていなかった…というだけなのでは。


> Button3は、何故かはいつまで経っても反応がなしとも。

Button2 は、「ディレクトリを見つけ次第、列挙を開始する」。
Button3 は、「ディレクトリをすべて抽出し終えてから、列挙を開始する」。
という違いがあります。

Button2 ですべてを列挙し終えるまでに 20分間を要するのであれば、
Button3 では 20分間応答なしとなり、その後で列挙が始まるということです。
解決済み
[ 親 88574 / □ Tree ] 返信 編集キー/

▲[ 88645 ] / 返信無し
■88651 / 11階層)  Re[11]: フォルダ名とその更新日時を一緒に収得
□投稿者/ なつ (14回)-(2018/09/13(Thu) 23:23:45)
No88645 (魔界の仮面弁士 さん) に返信

ありがとうございます。

> DataGridView1 は貼っていなかった…というだけなのでは。
はい、貼ってませんでした。
と言うか、DataGridView があること自体も知らなかったです(汗)

> Button3 では 20分間応答なしとなり、
ちょっぴり不思議なのは Button2 でも2秒足らずのもなことはあります。
解決済み
[ 親 88574 / □ Tree ] 返信 編集キー/

▲[ 88598 ] / ▼[ 88601 ]
■88599 / 6階層)  Re[6]: フォルダ名とその更新日時を一緒に収得
□投稿者/ Jitta (407回)-(2018/09/10(Mon) 10:15:28)
>> Dim Directori As String() = System.IO.Directory.GetDirectories("C:\Users\○○○\○○○", "*", System.IO.SearchOption.AllDirectories)
>> Dim Directori_Update As DateTime = System.IO.File.GetLastWriteTime(Directori(0))
> System.IO.Directory.GetDirectories は戻り値が配列であるがゆえに、
> すべてを列挙し終えるまで、結果が返却されません。
>

取り急ぎ
string?directoryinfo じゃないの?
だから同時に返っていると判断したんだけど??
[ 親 88574 / □ Tree ] 返信 編集キー/

▲[ 88599 ] / ▼[ 88644 ]
■88601 / 7階層)  Re[7]: フォルダ名とその更新日時を一緒に収得
□投稿者/ とっちゃん (522回)-(2018/09/10(Mon) 10:23:58)
No88599 (Jitta さん) に返信
> >> Dim Directori As String() = System.IO.Directory.GetDirectories("C:\Users\○○○\○○○", "*", System.IO.SearchOption.AllDirectories)
> >> Dim Directori_Update As DateTime = System.IO.File.GetLastWriteTime(Directori(0))
>>System.IO.Directory.GetDirectories は戻り値が配列であるがゆえに、
>>すべてを列挙し終えるまで、結果が返却されません。
> >
>
> 取り急ぎ
> string?directoryinfo じゃないの?
> だから同時に返っていると判断したんだけど??


DirectoryInfo.GetDirectories() なら 「DirectoryInfo の配列」ですが、質問者さんが書いているのは、
Directory.GetDirectories() なので、「string の配列」が返ってきます。

Jittaさんの揚げ足をとる形にしてますが、この些細な違いをきちんと認識できていないと、なんで同じようなことを何回も?
となるので、あえて突っ込んでおきます。

[ 親 88574 / □ Tree ] 返信 編集キー/

▲[ 88601 ] / ▼[ 88653 ]
■88644 / 8階層)  Re[8]: フォルダ名とその更新日時を一緒に収得
□投稿者/ Jitta (410回)-(2018/09/12(Wed) 21:57:25)
ちょっと気になっているんだけど、本当に実行したいことって何ですか?
「あるディレクトリ(サブディレクトリ含む)に変更があったことを検出したい」
じゃないですか?

定期的にファイル名と更新日時を取り出して、前回の値と比較して違うものを調べよう。
おっと、サブディレクトリ含めたディレクトリ名の列挙に時間がかかってしまう。
これじゃぁ、列挙している間に変更があってもわからないや。
ディレクトリ名と更新時刻を同時に取得するにはどうしたら?

ってことじゃないですか?
もしそういうことなら→ https://dobon.net/vb/dotnet/file/filesystemwatcher.html

解決済み
[ 親 88574 / □ Tree ] 返信 編集キー/

▲[ 88644 ] / 返信無し
■88653 / 9階層)  Re[9]: フォルダ名とその更新日時を一緒に収得
□投稿者/ なつ (15回)-(2018/09/15(Sat) 10:09:34)
No88644 (Jitta さん) に返信

> 「あるディレクトリ(サブディレクトリ含む)に変更があったことを検出したい」
ファイルの選別などに更新日時も活用したかったのです。
すみません。

解決済み
[ 親 88574 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -