Re: .NET Frameworkの仕様です

投稿者: 投稿日:2019/12/07(Sat) 08:18:42 No.2537

 こんにちは。

 やはりそうですよね。
 了解しました。
 ありがとうございました。

 それでは。

「フォルダ情報」種類を使います

投稿者:ゆうと 投稿日:2019/12/06(Fri) 19:36:06 No.2536

こんにちは ゆうとです。

> デスクトップから「報告書.xlsx」を取得してそのサイズを報告する
> という記述があるのですが、実際のプログラムでどう書けばいいのかが
> よくわかりません。

「フォルダ情報」種類の説明の方がわかりやすいかと思います。
https://rdr.utopiat.net/docs/reference/core/folderinfo.htm

「名前」「絶対パス」「サイズ表記」の各設定項目は、
「ファイル情報」種類のオブジェクトでないと取得できません。

調べたいパスを「フォルダ情報」種類に指定して作っておき、
「列挙する」手順で、そのフォルダにあるファイル名を調べます。
「列挙する」手順は、「ファイル情報」種類の配列なので、各設定項目が使えます。

-------------------
パスは、フォルダ情報(「[デスクトップ]」)を作る
フォルダ一覧は、パスから「*.*」を列挙する
フォルダ一覧のすべての要素についてそれぞれ繰り返す
  要素の名前&「 」&要素のサイズを報告する
繰り返し終わり
-------------------

なお、『フルパスで〜のファイルの一覧』は、文字列の配列を返す手順ですので、
文字列のパスでは「〜の名前」などの書き方が使えません。

「ファイル情報」種類と「フォルダ情報」種類は、比較的最近追加した種類ですので
ややこしいですが、プログラムを参考にして下さい。

.NET Frameworkの仕様です

投稿者:ゆうと 投稿日:2019/12/06(Fri) 18:52:37 No.2535

こんにちは ゆうとです。

.NET Framework 4の仕様で、260文字以上の長いパスはエラーとなるようです。
これは古いWindowsとの互換性を維持するためで、基本的には260文字以上のパスを使用できないと考えて下さい。

ただプロデル側でも設定の変更で一部のケースは対処可能なようです。ただ修正箇所が多数あり、対処しても実行可能ファイルではエラーとなるなどして完全な対応には手間が掛かりますので積極的には対処しません。
260文字以上となるのは希なケースと思いますので、基本的には対応できない、と考えて下さい。

パスが長くならないようにフォルダ名の作り方を改めるなどして、作り方の改良をお願いします。

よろしくお願いします。

Re^2: ファイルのサイズを取得するには

投稿者:smorkin 投稿日:2019/12/06(Fri) 12:51:03 No.2534

こんにちは、smorkin です。

陸 様、早速のアドバイス、ありがとうございます。

> 「 (ファイルのフルパス) 」のファイルのサイズを表示する

> でいけると思います。

はい、「サイズ」と「更新日」は取得することが出来ました。
しかし、「名前」「絶対パス」「サイズ表記」は、
エラーになってしまい、取得出来ませんでした。

引き続き、この件に関して情報をお待ちしております。
よろしくお願いいたします。

//プログラムのサンプル
一覧は、(フルパスで「[デスクトップ]」のファイルの一覧)
一覧を要素にそれぞれ繰り返す
要素のファイルの×××を報告する //×××は「名前」「サイズ」等
繰り返し終わり

//エラーメッセージ
『要素のファイル』という部分で
文字列型には「ファイル」という設定項目または手順がありません。
[エラー番号302]

◆動作環境情報◆
プロデル 1.6.983
Windows 10(64)
メモリ:6.92 GB

260文字を超えるパスの対応について

投稿者: 投稿日:2019/12/05(Thu) 22:09:03 No.2533

 お世話になっております。

 最近、260文字を超えるパスを扱うことがそれなりにあるんですが、プロデルではうまく扱うことができないようで、「System.IO.PathTooLongException」が発生してしまい、困っています。
 主に利用する操作としては、ファイルサイズの取得、更新日や作成日等の取得、ファイルの属性の取得などです。
 C#の使用上仕方ないのでしょうか。
 何か方法があれば、教えていただけると幸いです。

 以上、よろしくお願いいたします。

Re: ファイルのサイズを取得するには

投稿者: 投稿日:2019/12/05(Thu) 21:08:38 No.2532

 こんばんは。

「 (ファイルのフルパス) 」のサイズを表示する

ではなく、

「 (ファイルのフルパス) 」のファイルのサイズを表示する

でいけると思います。

 それでは。

ファイルのサイズを取得するには

投稿者:smorkin 投稿日:2019/12/05(Thu) 10:01:10 No.2531

こんにちは、smorkin です。

久しぶりに、選択したフォルダ内のファイルの一覧から、
ファイル名(だけ)・サイズ・更新日時などを
リストビューに(詳細)表示するプログラムを作成しています。

ところが、ファイルのサイズを取得する所でエラーとなり、つまずいています。

以前は、

「 (ファイルのフルパス) 」のサイズを表示する

で取得できていたのですが、現在のバージョンではエラーとなってしまいます。

リファレンス > ファイル情報
https://rdr.utopiat.net/docs/reference/core/fileinfo.htm

のプログラム例、

デスクトップから「報告書.xlsx」を取得してそのサイズを報告する

という記述があるのですが、実際のプログラムでどう書けばいいのかが
よくわかりません。
いろいろ試しているのですが、うまくいきません。

この件に関して、ご教示いただければ幸いです。
よろしくお願いいたします。

Re^2: こんな感じです

投稿者:アーク <info.nds.laboratry あっとまーくgmail.com> 投稿日:2019/11/23(Sat) 21:14:46 No.2530

こんばんは。アークです。

質問等有りましたら遠慮なくどうぞ。
プロデルとは関係ない内容でしたら私のブログの方でも構いまいません。

Re: こんな感じです

投稿者: 投稿日:2019/11/23(Sat) 11:55:36 No.2528

 こんにちは。

 うーん、なかなか難しいですね。
 もうちょっと頑張ってみます。
 ありがとうございました。

 それでは。

こんな感じです

投稿者:アーク <info.nds.laboratry あっとまーくgmail.com> 投稿日:2019/11/20(Wed) 09:56:20 No.2527

こんにちは。アークです。

疑似ウィンドウメッセージ方式の実体は「sendkeys()」です。
起動したら自分と同じプロセスを確認します。
この時点では未だウィンドウは持っていないのでタイトルも無いです。
それを利用して既に起動中のプロセスを見分けています。

今回は処理の複雑化を避ける為に最初の引数だけを扱っていますが、
引数を並べて処理をする事もできなくは有りません。
多重起動チェックで同じプロセスが既に起動していたら、
引数を送り自らは終了します。

問題は「sendkeys()」された引数を受け取る処理ですが、
プロデルの命令には無いようです。
そこで工夫をしてテキストボックスで受けるように細工しています。
そのテキストボックスは裏処理で使うだけなので領域外に追い出して隠しています。

テキストボックスで引数を受け取るとそのイベントを利用してキューに入れています。
これは既に起動していたプロセスの動作状態により直ぐに使えない状況が考えられるからです。
テキストボックスのイベントを使わずにタイマーで監視した方が良い場合も有ると思います。
以下、ソースです。
------------------------------------------------------------------------------------
もしプログラムの起動時設定が「」でないなら
  引数は、プログラムの起動時設定
  第一引数は、引数(1)
そうでないなら
  第一引数は、「」
もし終わり
一覧は、「TestApp」のプロセス一覧
インスタンス数は、一覧の個数

もしインスタンス数=1なら
  メイン画面を表示する
  待機する
そうでないなら
  一覧を要素にそれぞれ繰り返す
    もし要素のタイトルが「」でないなら
      要素へ「[第一引数]|」を入力する
    もし終わり
  繰り返し終わり
  終了する
もし終わり

メイン画面とは
  ウィンドウを継承する
  はじめの手順
    初期化する
    ーー貼り付けた部品に対する操作をここに書きます
    キュー1というキューを作る
    記録器は、文字列書込器を作ったもの
    値=0
  終わり
  初期化する手順
  ーー自動生成された手順です。ここにプログラムを書き加えても消える場合があります
  この実質大きさを{408,125}に変える
  この内容を「メイン画面」に変える
  初期化開始する
  テキスト2というテキストを作る
    その位置と大きさを{12,25,379,19}に変える
    その移動順を11に変える
  ボタン2というボタンを作る
    その位置と大きさを{280,72,85,32}に変える
    その内容を「表示」に変える
    その移動順を10に変える
  テキスト1というテキストを作る
    その位置と大きさを{12,-100,380,19}に変える
    その文字配置を「左」に変える
    その移動順を1に変える
    その背景色を「」に変える
  ボタン1というボタンを作る
    その位置と大きさを{154,72,85,32}に変える
    その内容を「全て終了」に変える
    その移動順を9に変える
  初期化終了する
終わり
  
  開いた時の手順
    テキスト1の内容を「[第一引数]」に変える
    引数を更新する
  終わり
  
  アクティブ時の手順
    テキスト1へフォーカス
  終わり

  ボタン1がクリックされた時の手順
    記録器をクリアする
    一覧を要素にそれぞれ繰り返す
      終了する
    繰り返し終わり
  終わり

  テキスト1の内容が変化した時の手順
    もし(テキスト1の内容の末尾から1文字取り出したもの)が「|」なら
      引数を更新する
    もし終わり
  終わり
  
  引数を更新する時の手順
    もしテキスト1の内容が「」でないなら
      キュー1に「[テキスト1の内容]」を入れる
      テキスト1の内容を「」にする
    もし終わり
  終わり

  ボタン2がクリックされた時の手順
    もしキュー1の要素数>0なら
      テキスト2の内容を(キュー1から取り出したもの)に変える
    そうでないなら
      テキスト2の内容を「」に変える
    もし終わり
  終わり
終わり
------------------------------------------------------------------------------------

次はNTFS代替データストリーム(ADS:Alternate Data Stream)方式です。
ADS自体はフォルダやバイナリも対象になっているので網羅して実装すると大変なのですが、
テキストに限定して個数や名前も固定して使うのなら比較的容易です。
今回は最も簡単な方法で実装してみました。

この方式は先の「sendkeys()」方式とは異なり共有メモリのイメージに近いです。
多重起動のチェック等は先の方式と同じです。
引数はADSの裏ストリームへ一時保存します。

先に起動していたプロセス側はアクティブ時に裏ストリームから読み出してキューに蓄積します。
フォーカスイベント利用しているので完全にバックグラウンドで動かす場合には、
やはりタイマーなどで定期的にチェックした方が良いかも知れません。
どちらの方式も引数を渡す処理以外は手を抜いています。

この方式の条件は使用するストレージのファイルシステムがNTFSで有る事です。
今のウィンドウズは殆どがそうだと思います。
以下がソースです。
------------------------------------------------------------------------------------
もしプログラムの起動時設定が「」でないなら
  引数は、プログラムの起動時設定
  第一引数は、引数(1)
  「echo [第一引数]>"[プログラムの位置]TestApp.exe:argument"」をコマンド実行する
そうでないなら
  第一引数は、「」
もし終わり
一覧は、「TestApp」のプロセス一覧
インスタンス数は、一覧の個数

もしインスタンス数=1なら
  メイン画面を表示する
  待機する
そうでないなら
  一覧を要素にそれぞれ繰り返す
    もし要素のタイトルが「」でないなら
      要素のIDのプロセスへ切り替える
    もし終わり
  繰り返し終わり
  終了する
もし終わり

メイン画面とは
  ウィンドウを継承する
  はじめの手順
    初期化する
    ーー貼り付けた部品に対する操作をここに書きます
    キュー1というキューを作る
  終わり
  初期化する手順
  ーー自動生成された手順です。ここにプログラムを書き加えても消える場合があります
  この実質大きさを{408,125}に変える
  この内容を「メイン画面」に変える
  初期化開始する
  テキスト1というテキストを作る
    その位置と大きさを{12,25,379,19}に変える
    その最大文字数を200に変える
    その選択表示維持を○に変える
    その移動順を11に変える
  ボタン2というボタンを作る
    その位置と大きさを{280,72,85,32}に変える
    その内容を「表示」に変える
    その移動順を10に変える
  ボタン1というボタンを作る
    その位置と大きさを{154,72,85,32}に変える
    その内容を「全て終了」に変える
    その移動順を9に変える
  初期化終了する
終わり
  
  アクティブ時の手順
    テキスト1へフォーカス
    引数を更新する
  終わり

  ボタン1がクリックされた時の手順
    キュー1をすべて消す
    「@PowerShell ^&{Clear-Item -Path '[プログラムの位置]TestApp.exe' -Stream argument}」をコマンド実行する
    一覧を要素にそれぞれ繰り返す
      終了する
    繰り返し終わり
  終わり
  
  引数を更新する時の手順
    結果は、「more < "[プログラムの位置]TestApp.exe:argument"」をコマンド実行したもの
    「@PowerShell ^&{Remove-Item -Path '[プログラムの位置]TestApp.exe' -Stream argument}」をコマンド実行する
    もし結果が「」でないなら
      キュー1に「[結果]」を入れる
    もし終わり
  終わり

  ボタン2がクリックされた時の手順
    もしキュー1の要素数>0なら
      テキスト1の内容を(キュー1から取り出したもの)に変える
    そうでないなら
      テキスト1の内容を「」に変える
    もし終わり
  終わり
終わり
------------------------------------------------------------------------------------

▲ページの先頭へ

- WebForum -