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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

全過去ログを検索

<< 0 >>
■14219  Re[1]: XMLの要素をDeserializeで配列にしたい。
□投稿者/ Hongliang -(2008/02/13(Wed) 15:59:44)
    自身直下の要素は XmlArrayItem 属性じゃなくて XmlElement 属性を指定してください。

    該当 xml ファイルの XML Schema を書いて xsd.exe でクラス化すると XmlSerializer に使用する属性の使い方が結構分かりますよ。余計なのも付いてきますけど。
記事No.14217 のレス /過去ログ30より / 関連記事表示
削除チェック/

■39046  Re[2]: フォームのコントロールボックスを使う
□投稿者/ ぽぴ王子 -(2009/07/29(Wed) 18:30:49)
>
    またムチャなこと言ってくるなあ…

    FormBorderStyle が Sizable と同等の状態で、なおかつウィンドウの枠は出さないという
    ことですか?

    私も aetos さんと同じで、なぜ FormBoderStyle を None にしているのか、がわからないです。
    ウィンドウの枠を出したくないということなのだとしても、なぜ出したくないのか?から疑問
    なので、その辺は素直な疑問です。

    僕もそんなに詳しいわけじゃないですが、Sizable の時の枠って「ここはサイズ変更可能なところ
    なんだよ!」という意味でついているんだと思っています。ところがそれを無くしたいということは
    何らかの理由があるはずですよね。Windows の UI に逆らってまでなんとかしたい理由というものが。
    ちょっとそれを教えていただきたいなと。

    ちなみにやろうとした場合、FormBoderStyle を Sizable にして、無理矢理ウィンドウの枠を表示
    しないようにするとか(できるのかどうかはともかく)、FormBoderStyle は None のままにして
    コントロールボックスやフォームサイズの変更部分を自前でなんとかするか(リンク先の方法に
    近いと思います)ぐらいしか思い浮かびませんでした。
    自分がそういったことをしろと言われたら「できません」と言って泣きを入れます。たいてい
    そういったインターフェースってのは、何も考えずに「これカッコイイ!」とか言って提案した
    ものだったりして、仕様レベルで覆せるものだったりすることが多いので。
記事No.39043 のレス /過去ログ67より / 関連記事表示
削除チェック/

■88598  Re[5]: フォルダ名とその更新日時を一緒に収得
□投稿者/ 魔界の仮面弁士 -(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 しながら
    再帰的に列挙した方が良いかも知れません。
記事No.88574 のレス /過去ログ152より / 関連記事表示
削除チェック/

■88600  Re[6]: フォルダ名とその更新日時を一緒に収得
□投稿者/ 魔界の仮面弁士 -(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) インスタンス メソッド
記事No.88574 のレス /過去ログ152より / 関連記事表示
削除チェック/

■88613  Re[8]: フォルダ名とその更新日時を一緒に収得
□投稿者/ 魔界の仮面弁士 -(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 → なし
記事No.88574 のレス /過去ログ152より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -