• 受付中

VBAにて4万個のファイル一覧を書き出したい

ネットで見かけた以下コードで、サブフォルダも含めてファイル一覧を書き出したい。 フォルダに4万個のファイルがあるのですが、すぐにフリーズしてしまいます。 VBAでは大量データを扱うのは無理があるのでしょうか? Sub TEST7() Dim A A = "C:\Users\User\Desktop\DATA" i = 1 Call TEST8(A, i) End Sub Sub TEST8(A, i) Dim FSO Set FSO = CreateObject("Scripting.FileSystemObject") With ActiveSheet Dim B 'フォルダ内のファイルをループ For Each B In FSO.GetFolder(A).Files i = i + 1 .Cells(i, 1) = A 'フォルダパス .Cells(i, 2) = B 'ファイルパス .Cells(i, 3) = FSO.GetFileName(B) 'ファイル名 .Cells(i, 4) = FSO.GetExtensionName(B) '拡張子 .Cells(i, 5) = FSO.GetFile(B).Size 'サイズ .Cells(i, 6) = FSO.GetFile(B).DateCreated '作成日時 .Cells(i, 7) = FSO.GetFile(B).DateLastModified '更新日時 .Cells(i, 8) = FSO.GetFile(B).DateLastAccessed 'アクセス日時 Next Dim C 'フォルダ内のサブフォルダをループ For Each C In FSO.GetFolder(A).SubFolders i = i + 1 .Cells(i, 1) = C. 'フォルダパス .Cells(i, 5) = FSO.GetFolder(C).Size 'サイズ .Cells(i, 6) = FSO.GetFolder(C).DateCreated '作成日時 .Cells(i, 7) = FSO.GetFolder(C).DateLastModified '更新日時 .Cells(i, 8) = FSO.GetFolder(C).DateLastAccessed 'アクセス日時 '再帰する Call TEST8(C, i) Next End With End Sub

みんなの回答

  • luka3
  • ベストアンサー率73% (460/630)
回答No.5

もう解決したのかもしませんが 再帰を使わないとなると、dirコマンドを活用するのが一番簡単かと思います。 また一度に全部処理せず、二段構えで、まず最初にファイル一覧を取得し、その次にサイズ等の処理をするようにしました。 自分の環境で試したところ、ファイル数約44000で、一覧取得に約10秒、サイズ取得は約30秒で終わりました。 ただ雑多なフォルダで試したので、ファイル名にUnicodeが含まれている部分でエラーが出ました。そのあたりはFSO.FileExistsでチェックして回避すればよいかと。 Sub GetFileList() Dim objShell As Object Dim objExec As Object Dim line As String Dim A, i, d, dbak dbak = "" i = 1 A = "C:\Users\User\Desktop\DATA" ChDrive A ChDir A ' WScript.Shell オブジェクトを作成し、dir コマンドを実行 Set objShell = CreateObject("WScript.Shell") Set objExec = objShell.Exec("cmd /c dir /s /b /a-d") With ActiveSheet ' 出力を逐一読み取る Do While Not objExec.StdOut.AtEndOfStream line = objExec.StdOut.ReadLine d = Left(line, InStrRev(line, "\") - 1) ' フォルダ名 ' フォルダ名の変更があるか If d <> dbak And dbak <> "" Then i = i + 1 .Cells(i, 1) = d 'フォルダパス End If dbak = d ' フォルダ名を記憶 i = i + 1 .Cells(i, 1) = d 'フォルダパス .Cells(i, 2) = line 'ファイルパス .Cells(i, 3) = Mid(line, InStrRev(line, "\") + 1) 'ファイル名 Loop End With Set objExec = Nothing Set objShell = Nothing End Sub Sub GetProperty() Dim FSO As Object Dim i, f Set FSO = CreateObject("Scripting.FileSystemObject") With ActiveSheet For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row If .Cells(i, 2) <> "" Then ' ファイル Set f = FSO.GetFile(.Cells(i, 2)) .Cells(i, 4) = FSO.GetExtensionName(.Cells(i, 2)) '拡張子 Else ' フォルダ Set f = FSO.GetFolder(.Cells(i, 1)) End If .Cells(i, 5) = f.Size 'サイズ .Cells(i, 6) = f.DateCreated '作成日時 .Cells(i, 7) = f.DateLastModified '更新日時 .Cells(i, 8) = f.DateLastAccessed 'アクセス日時 Set f = Nothing Next End With Set FSO = Nothing End Sub

すると、全ての回答が全文表示されます。
  • SI299792
  • ベストアンサー率47% (793/1658)
回答No.4

Dir コマンドが完了するまでプログラムを一時停止させる為のものです。 ファイルサイズが前と違っていたら、Dir が完了していない。この状態で次へ進むと全て拾えない可能性があります。沢山ファイルがあるそうなのであった方がいいと思いました。 私の所では、あっても問題なく動くので、あると動かない理由は解りませんが、無しで動くならない方がいいです。 ここを外した状態でのテストはしていません。

gennya
質問者

補足

回答ありがとうございます。 もしかして、 Length = FileLen("#.txt")をどこかに書くことが 漏れているとかでしょうか?

すると、全ての回答が全文表示されます。
  • SI299792
  • ベストアンサー率47% (793/1658)
回答No.3

これ、全項目必要ですか? リカーシブコールはメモリーを多量に使います。なので、フリーズしたり、メモリー不足で止まります。 対策 ・リカーシブコールを使わないようにプログラムを直す(私の力では無理) ・ファイルの取得は、コマンドプロンプトを使う。(以下プログラム) スピードアップのため、項目を絞ります。 画像の様にB1にフォルダ名を入力して下さい (プログラムに直接フォルダを書くのは私は嫌いです) どうしても作成日時やアクセス日時が必要なら、自分で直す・又は補足に書いて下さい(気が向けば直しますが、スピードは若干下がります) 逆に、ファイル名だけでいいなら、もう少し早くできます。 Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Option Explicit ' Sub Macro1()   Dim Length As Long   Dim ROut As Long   Dim RSav As Long   Dim FileData As String '   ChDrive [B1]   ChDir [B1]   Shell "Cmd /C Dir *.* /S > #.txt"   Sleep 200 '   Do While Length <> FileLen("#.txt")     DoEvents     Sleep 100   Loop   ROut = 3   Range("A3:D" & Rows.Count).ClearContents   Open "#.txt" For Input As #1   Application.ScreenUpdating = False '   Do Until EOF(1)     Line Input #1, FileData '     If FileData Like "*のディレクトリ" Then       Length = Len(FileData)       Cells(ROut, "A") = Mid(FileData, 2, Length - 9)       RSav = ROut       ROut = ROut + 1     ElseIf Left(FileData, 1) = "2" And Mid(FileData, 22, 1) <> "<" Then       Cells(ROut, "A") = Cells(ROut - 1, "A")       Cells(ROut, "B") = Mid(FileData, 37)       Cells(ROut, "C") = Mid(FileData, 19, 17)       Cells(ROut, "D") = Left(FileData, 17)       ROut = ROut + 1     ElseIf FileData Like "*バイト" Then       Cells(RSav, "C") = Mid(FileData, 25, 19)     End If   Loop   Close   Kill "#.txt" End Sub

gennya
質問者

補足

回答ありがとうございます。 以下コードを消したら動きました。 このコードは何なのでしょうか? Do While Length <> FileLen("#.txt")     DoEvents     Sleep 100 Loop

すると、全ての回答が全文表示されます。
回答No.2

ご質問のVBAコードでは、メモリに確保された変数FSOや変数Bや変数Cを、使用後に開放していない為、どんどんメモリを消費していき、メモリの消費量が増えるにつれ、処理が重くなり、フリーズしたようになります。 また、使用したFSOオブジェクトが不要になったら、クローズしないとメモリやリソースを消費します。 以下のように「後始末」を追加してみて、それでも重い(フリーズする)のであれば、VBAは4万個のファイル数には耐えられないのだろうと思われます。 Sub TEST7() Dim A A = "C:\Users\User\Desktop\DATA" i = 1 Call TEST8(A, i) End Sub Sub TEST8(A, i) Dim FSO Set FSO = CreateObject("Scripting.FileSystemObject") With ActiveSheet Dim B 'フォルダ内のファイルをループ For Each B In FSO.GetFolder(A).Files i = i + 1 .Cells(i, 1) = A 'フォルダパス .Cells(i, 2) = B 'ファイルパス .Cells(i, 3) = FSO.GetFileName(B) 'ファイル名 .Cells(i, 4) = FSO.GetExtensionName(B) '拡張子 .Cells(i, 5) = FSO.GetFile(B).Size 'サイズ .Cells(i, 6) = FSO.GetFile(B).DateCreated '作成日時 .Cells(i, 7) = FSO.GetFile(B).DateLastModified '更新日時 .Cells(i, 8) = FSO.GetFile(B).DateLastAccessed 'アクセス日時 Next Dim C 'フォルダ内のサブフォルダをループ For Each C In FSO.GetFolder(A).SubFolders i = i + 1 .Cells(i, 1) = C. 'フォルダパス .Cells(i, 5) = FSO.GetFolder(C).Size 'サイズ .Cells(i, 6) = FSO.GetFolder(C).DateCreated '作成日時 .Cells(i, 7) = FSO.GetFolder(C).DateLastModified '更新日時 .Cells(i, 8) = FSO.GetFolder(C).DateLastAccessed 'アクセス日時 '再帰する Call TEST8(C, i) Next set C = Nothing set B = Nothing End With FSO.Close set FSO = Nothing End Sub

gennya
質問者

お礼

回答ありがとうございます。 最初の20行くらい書き出したら止まってしまいます。メモリ不足のようです。

Powered by GRATICA
すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率66% (1745/2621)
回答No.1

こちらのサイトを参考にしてみてはいかがでしょう。 多少変更したら使えるような気がします。 【VBA】フォルダ内のファイル一覧を,サブフォルダも含めて高速に取得する https://latex-macintosh.hatenablog.com/entry/2019/12/01/011502

gennya
質問者

お礼

回答ありがとうございます。 dirを使うことがポイントのようですね。コードをいじってみましたが、私の技量では動かなかったのと、別の方がdirを使ったコードを提示していただけたので、そちらでチャレンジしてます。

Powered by GRATICA
すると、全ての回答が全文表示されます。

回答受付中のQ&A

  • 【Windows11】ウインドウズ11でテンキーだ

    【Windows11】ウインドウズ11でテンキーだけでPCフォルダを開く方法を教えてください。 そんなショートカットキーって存在しますか?

    • 回答数2
  • ABC列とFGH列を比較し、重複データには☆印付与

    下記が実現できるコードをお教えください。 AとF列を比較、BとG列を比較、C、Hを比較し、すべて同じなら☆を付与したい。 A列 B列 C列  D  E   F列 G列 H列  I列 本  2  赤        石  7  緑  ☆ 華  5  黄        山  20  黒 石  7  緑  ☆ ************************* 出来ればh ttps://oshiete.goo.ne.jp/qa/9060260.htmlにあるベストアンサーのやり方を希望しています。 セルのデータを一気に読み込んでいる? このやり方です。 With Worksheets("管理票")     With .Range("A2", .Cells(Rows.Count, "A").End(xlUp)).Resize(, 3)       vA = .Value こんな感じで比較 If (dic.Exists(sS)) Then

    • 回答数5
  • フィモーラのレンダリングが途中で止まってしまいます

    windows11で実行のフィモーラ14が100倍速で18時間のタイムラプス動画の書き出し前のレンダリングをしてるのですが、どういうわけかレンダリングが途中で急に止まってしまい、出先からRemoteでレンダリングを実施するのですが、再び止まってしまいます。 laptopなのでメモリ自体が低いのですが、それが原因でしょうか。 他にシステム上の原因の可能性はございますでしょうか。 詳しい方ございましたら何卒よろしくお願い致します。

    • 回答数0
  • oracleのdecodeについて

    初歩的なことですみません。 oralceのdecodeについて教えていただきたいのですが、 select decode(add_date,null,'*',add_date) from tableA; or select decode(add_date,null,'null',add_date) from tableA; ですが、 nullでない場合、 yyyy/mm/dd を期待したのですが、yyyy-mm-ddが返されます。 add_dateはdate型で、yyyy/mm/ddとなっているのですが、 このような表示になるのでしょうか。

    • 回答数1
  • windows11のインストールに失敗します

    HPのZ440ワークステーションのデスクトップPCでPowerShellでサーバーをショートカットしてTM2.0を認識させずにインストールさせる方法なのですが、ノートパソコンはすべてこの方法でインストールに成功したのですが、どうしてもこのデスクトップだけはインストールに失敗致します。 原因・対策は何かございますでしょうか。

    • 回答数5
  • pythonのfletでViewの使い方について2

    pickerで得た画像ファイルのパスをを元に別Viewで循環表示及び保存したファイルパスのテキストファイルから読み込み画像表示をするコードを見よう見まねで下記のようにしてみました。以前相談した2つのファイルを使った方法では、パスデータを引数で切り替えだけで済んでいたのですが、今回は、切った張ったしたせいか複雑化したように思えます。このような方法で正しいかあるいは無駄な部分がないかどうかお教えください。 import flet as ft import sys, os def main(page: ft.Page): selected_files = ft.Text() images = [""] def pick_files_result(e: ft.FilePickerResultEvent): nonlocal images images = [f.path for f in e.files] if e.files else [] selected_files.value = ",".join(images) if images else "Cancelled!" selected_files.update() if images: current_image_index[0] = 0 image.src = images[current_image_index[0]] page.update() pick_files_dialog = ft.FilePicker(on_result=pick_files_result) page.overlay.append(pick_files_dialog) def move_file(self): page.go("/store") #保存ファイルからパスデータを読み込む def remove_file(self): SCRIPT_DIR = os.path.dirname(__file__) SAVE_FILE = os.path.join(SCRIPT_DIR, "VF_FILE.txt") with open(SAVE_FILE, "r", encoding="utf-8") as f: sav_files = f.read() nonlocal images images = f"{sav_files}".split(",") if images: current_image_index[0] = 0 image.src = images[current_image_index[0]] page.update() page.go("/store") #page.add() images = images current_image_index = [0] image = ft.Image(src=images[current_image_index[0]], width=300, height=200) def next_image(e): current_image_index[0] = (current_image_index[0] + 1) % len(images) image.src = images[current_image_index[0]] page.update() def prev_image(e): current_image_index[0] = (current_image_index[0] - 1) % len(images) image.src = images[current_image_index[0]] page.update() # 画像のリストをテキストファイルとして保存する def save_file(e): image_list = ",".join(images) with open("D:/Python/Flet/VF_FILE.txt", "w", encoding="utf-8") as f: f.write(image_list) def route_change(route): page.views.clear() page.views.append( ft.View( "/", [ ft.AppBar(title=ft.Text("Flet app"), bgcolor=ft.Colors.AMBER_600), ft.ElevatedButton("save_image",on_click=remove_file), #ft.ElevatedButton("Visit Store", on_click=lambda _: page.go("/store")), ft.Row( [ ft.ElevatedButton( "Pick files", icon=ft.Icons.UPLOAD_FILE, on_click=lambda _: pick_files_dialog.pick_files( allow_multiple=True, file_type=ft.FilePickerFileType.IMAGE ), ), selected_files, ] ), ft.ElevatedButton("Pick_image",on_click=move_file), ], ) ) if page.route == "/store": page.views.clear() page.views.append( ft.View( "/store", [ ft.AppBar(title=ft.Text("Store"), bgcolor=ft.Colors.BLUE_GREY_200), image, ft.Row([ft.ElevatedButton(text="前の画像", on_click=prev_image), ft.ElevatedButton(text="次の画像", on_click=next_image)]), ft.ElevatedButton("Save", on_click=save_file),ft.ElevatedButton("Go Home", on_click=lambda _: page.go("/")), ], ) ) page.update() def view_pop(view): page.views.pop() top_view = page.views[-1] page.go(top_view.route) page.on_route_change = route_change page.on_view_pop = view_pop page.go(page.route) ft.app(target=main)

    • 回答数1
  • MS PDFプリンターでカスタム用紙サイズを設定

    プリントサーバプロパティからカスタムサイズを指定しましたが、Windows内蔵のPDFプリンタからそれを選択することが出来ません。レジストリエディタや特定のファイルをいじることでできそうでしたが、大きなサイズを指定する場合しか見つけられませんでした。 指定したいサイズは4x6インチサイズ(10.1x15.24センチ)です。OSはWindows11です。どうかよろしくお願いします。

    • 回答数1
  • いきなりPDF ver.11COMPLETE

    このソフトはシリーズ含め初めて使う素人です、直接編集がうまく出来ません。 ヘルプからマニュアルを見てもタブの説明ばかりで、編集書き換えの方法(手順)が解らないので困っています。

    • 回答数1
  • Linux Ubuntu22.04LTS重たい

    windows10OSが入っているPCにUbuntu22.04LTSをDVDから起動したのですが、大変PCが重たくて、動作が遅いです。UbuntuをPCにインストールすれば軽くなりますか?それともPCのスペックの問題でしょうか?HPのCPU i5-4590 メモリ8Gです。閲覧ありがとうございます。回答宜しくお願い致します。

    • 回答数4
  • PIC16F1827で #use i2c

    PIC16F1827において (CCS Cコンパイラにより) #use delay(clock = 32000000) #use i2c (master,sda=PIN_B1,scl=PIN_B4,FAST=100000,FORCE_HW) B1とB4ピンはデジタル入力に設定して i2c_start(); i2c_write(0x15); を実行しても B1とB4ピンからは何も出力しません。 どうすればよいか教えてください。 何かほかにレジスタを設定する必要があるのでしょうか? そのようなことはコンパイラがやってくれるのだと思いなにもしていませんが・・・ なお、 #use i2c (master,sda=PIN_B1,scl=PIN_B4) とすればB4ピンからは出力がありますがB1ピンからは何も出力しません。

    • 回答数1
  • シェルスクリプトで質問

    #! /bin/bash eval 'exec /usr/bin/perl -S $0 ${1+"$@"}' If 0; 上記を実行したら /bin/sh: 0: Illegal option -S とエラーが出て、perlにオプション-Sが渡りません。どうしたら渡るのでしょうか?

    • 回答数1
  • クイックアシスタントでログインできません。

    クイックアシスタントを使おうとしています。アプリを起動し、「一覧にないユーザーを助ける」を選択し、マイクロソフトIDを入力して進めています。サインインの際、「通知の送信」を押すと、スマホにサインイン要求は届くのですが、それよりも早く要求タイムアウトになります。 内容は「再任用級の承認に使用するMincrosoftアプリにサインイン要求を送信しましたが、承認を受けられませんでした。再試行して、別の要求を送信します」です。 1秒も満たない待機画面はどうすれば対応できるでしょうか? OS:Windows11 Home Ver:24H2

    • 回答数1
  • HDD移行について

    現在、Windows10 PROマシンにOracleクライアントをインストールして クラサバデータベースアプリケーションを使用しています。 今度、Windows11 PROマシンに入れ替える予定をしています。 その場合なのですが、HDD移行ツールなのを利用して Oracleクライアントを設定も含めて移行することはできますか。 ご存知の方いらっしゃたらご教授お願いいたします。

    • 回答数1
  • AX88179のドライバのコンパイルにてエラー

    AlmaLinux9.5 カーネルは、5.14.0-503.21.1.el9_5.x86_64 以下のグループはインストール済 RPM Development Tools Development Tools # rpm -qa | grep kernel | sort kernel-5.14.0-503.21.1.el9_5.x86_64 kernel-core-5.14.0-503.21.1.el9_5.x86_64 kernel-devel-5.14.0-503.21.1.el9_5.x86_64 kernel-headers-5.14.0-503.21.1.el9_5.x86_64 kernel-modules-5.14.0-503.21.1.el9_5.x86_64 kernel-modules-core-5.14.0-503.21.1.el9_5.x86_64 kernel-tools-5.14.0-503.21.1.el9_5.x86_64 kernel-tools-libs-5.14.0-503.21.1.el9_5.x86_64 # 上記の状態でコンパイルすると以下のエラーが表示されてコンパイル出来ません。 ----- # cd ASIX_USB_NIC_Linux_Driver_Source_v3.4.0 # make make -C /lib/modules/5.14.0-503.21.1.el9_5.x86_64/build M=/root/ASIX_USB_NIC_Linux_Driver_Source_v3.4.0 modules make[1]: ディレクトリ '/usr/src/kernels/5.14.0-503.21.1.el9_5.x86_64' に入ります CC [M] /root/ASIX_USB_NIC_Linux_Driver_Source_v3.4.0/ax_main.o /root/ASIX_USB_NIC_Linux_Driver_Source_v3.4.0/ax_main.c: 関数 ‘ax_probe’ 内: /root/ASIX_USB_NIC_Linux_Driver_Source_v3.4.0/ax_main.c:2160:9: エラー: 関数 ‘netif_napi_add’ への引数が多すぎ ます 2160 | netif_napi_add(netdev, &axdev->napi, ax_poll, AX88179_NAPI_WEIGHT); | ^~~~~~~~~~~~~~ 次のファイルから読み込み: /root/ASIX_USB_NIC_Linux_Driver_Source_v3.4.0/ax_main.h:21, 次から読み込み: /root/ASIX_USB_NIC_Linux_Driver_Source_v3.4.0/ax_main.c:17: ./include/linux/netdevice.h:2694:1: 備考: ここで宣言されています 2694 | netif_napi_add(struct net_device *dev, struct napi_struct *napi, | ^~~~~~~~~~~~~~ make[2]: *** [scripts/Makefile.build:249: /root/ASIX_USB_NIC_Linux_Driver_Source_v3.4.0/ax_main.o] エラー 1 make[1]: *** [Makefile:1944: /root/ASIX_USB_NIC_Linux_Driver_Source_v3.4.0] エラー 2 make[1]: ディレクトリ '/usr/src/kernels/5.14.0-503.21.1.el9_5.x86_64' から出ます make: *** [Makefile:75: all] エラー 2 # ----- どのようにしたらエラーを発生させずにコンパイル出来るか教えて頂きたいです。

    • 回答数1
  • OKIのプリンタC5200nのエラー002について

    メーカーで既にサポート終了したOKIのプリンタC5200nを使用しています。消耗品(トナーなど)が十分にあるので、実質紙代と電気代だけで印刷しています。多少のトラブルは自分で解消してきました。ところが最近「002: エラー 05F6D09C 05F6D038 05F63A1C」というエラーがプリンタのLCDに表示されるようになりました。マニュアルによると、電源の再投入で治らなければ、サービスコールでメーカーにCPUボード(ARC/SPAボード)交換を依頼する必要があるとの事です。幸い、別にCPUボードを保有しており、ボード交換しても同様のエラーが発生します。CPUボード以外に問題があるように思えます。 この002エラーメッセージに続く「05F6D09C 05F6D038 05F63A1C」の意味がお分かりのOKIエンジニアの方がおられましたら、ご教授いただければ大変かります助かります。 使用環境は、Windows11 (ドライバはマイクロソフトの認証を無視してインストールし、数年使用して問題なし)、LANあるいはUSB接続です。エラー発生頻度は何日かに1回という感じで、それ以外は普通に印刷できています。 サービス終了品ですので、自身で解決できればと思っています。 よろしくお願いします。

    • 回答数0
  • 古いMac Bookに軽いOSをインストールしたい

    2012年のMacbook proを主にネットサーフィンに使ってきましたが、さすがに動作が遅いと感じるようになりました。 Linuxをインストールしようかと考えているのですが、おすすめのディストリビューション(Linux Lite/Bodhi Linux/Xubuntuなど)はありますでしょうか? 1.かなり前に別PCにUbuntuをインストールした経験はあるが初心者などで、インストールが難しいものは無理です。 2.当該MacはSSDに換装済みです。

    • 回答数1
  • 既存のプログラムがあるのに自分好みに自作した人

    メモ帳やブラウザなど何でもいいのですが、すでに世の中にいくらでもあるけど、使いにくいので自作したって人いますか? どのようなアプリを自作したのでしょうか? 会社で使う業務専用のもの以外でお願いします。

    • 回答数5
  • 真に無料なGUIパーティション編集ソフトってある?

    検索すると、自演絶賛記事に誘導される無料と偽ったソフトがゴロゴロでまともなのが見当たりません。 検索力の無さか、根気の無さか、両方か。 EaseUSは今まではなんだかんだ無料で使えてきたんですが、ついに駄目になりました。 (古いのをアーカイブあたりから引っこ抜いてくればいいのか?) いいもの教えてください。 DiskPartはいじりたくない…。

    • 回答数2
  • pythonのfletでパスの選択で画像表示をする

    FletというPythonのGUIライブラリを用いて画像を循環表示させることに挑戦しています。一応下記のように選択した複数の画像ファイのパスを引数として別ファイルで読み込み画像表示までは出来ました。しかしながらこれでは保存用のテキストファイルは別にして2つのファイルにまたがるため無駄で動作が遅く感じられます。そのため1つのファイルに纏められないかとおもいましたがflet初心者では全く手に負えません。 出来るなら2個のView画面で実現できればと思います。 よろしくおねがいします。 # test003_11.py・・選択した複数の画像ファイのパスをテキストデータとして引数とし別ファイルで開く import flet as ft import sys, os import subprocess def main(page: ft.Page): def pick_files_result(e: ft.FilePickerResultEvent): selected_files.value = ( ",".join(map(lambda f: f.path, e.files)) if e.files else "Cancelled!" ) selected_files.update() pick_files_dialog = ft.FilePicker(on_result=pick_files_result) selected_files = ft.Text() page.overlay.append(pick_files_dialog) def move_file(self): page.window_destroy() image_data=f"{selected_files.value}".split(",") subprocess.run(["python","Flet/test001_11.py"]+ image_data, capture_output=True, text=True, encoding='utf-8') def remove_file(self): page.window_destroy() SCRIPT_DIR = os.path.dirname(__file__) SAVE_FILE = os.path.join(SCRIPT_DIR, "VF_FILE.txt") with open(SAVE_FILE, "r", encoding="utf-8") as f: s = f.read() image_data=f"{s}".split(",") subprocess.run(["python","Flet/test001_11.py"]+ image_data, capture_output=True, text=True, encoding='utf-8') page.add( ft.Row( [ ft.ElevatedButton( "Pick files", icon=ft.Icons.UPLOAD_FILE, on_click=lambda _: pick_files_dialog.pick_files( allow_multiple=True, file_type=ft.FilePickerFileType.IMAGE ), ), selected_files ] ), ft.Column([ft.ElevatedButton("image",on_click=move_file),ft.ElevatedButton("remove",on_click=remove_file)]) ) ft.app(main) #test001_11.py・・引数からファイルパスを読込み画像を循環表示 import math import flet as ft import sys, os import subprocess def main(page: ft.Page): page.window_width = 600 page.window_height = 580 page.bgcolor = ft.colors.ORANGE # 画像のリスト images = sys.argv[1:] # 引数から指定画像形式のみを抽出 current_image_index = [0] image = ft.Image(src=images[current_image_index[0]], width=570, height=480,) page.add(image) def next_image(e): if current_image_index[0] < len(images) - 1: current_image_index[0] += 1 else: current_image_index[0] = 0 # 最後の画像の後は最初に戻る image.src = images[current_image_index[0]] page.update() def prev_image(e): if current_image_index[0] > 0: current_image_index[0] -= 1 else: current_image_index[0] = len(images) - 1 image.src = images[current_image_index[0]] page.update() def first_image(e): current_image_index[0] = 0 image.src = images[current_image_index[0]] page.update() def move_file(self): page.window_destroy() subprocess.run(["python","Flet/test003_11.py"], encoding='utf-8') def save_file(e): image_list = ",".join(images) with open("D:/Python/Flet/VF_FILE.txt", "w", encoding="utf-8") as f: f.write(image_list) next_button = ft.IconButton( icon=ft.Icons.PLAY_CIRCLE_FILL_OUTLINED, on_click=next_image,icon_color="blue500") prev_button = ft.IconButton( icon=ft.Icons.PLAY_CIRCLE_FILL_OUTLINED, on_click=prev_image,rotate=ft.Rotate(angle=-1 * math.pi),icon_color="blue500") first_button = ft.IconButton( icon=ft.Icons.PAUSE_CIRCLE_FILLED_ROUNDED, on_click=first_image) move_button = ft.ElevatedButton("main",on_click=move_file) save_button = ft.ElevatedButton("保存",on_click=save_file) button_row = ft.Row([prev_button,first_button, next_button,move_button,save_button],spacing=0,) page.add(button_row) page.update() ft.app(target=main)

    • 回答数1
  • マイクラのクラッシュ理由と解決方法を教えてください

    現在マインクラフトのバージョン1.12.2javaでMODを入れて遊んでいるのですが、原因がよくわからないクラッシュに見舞われています。 これの理由と解決方法がわからないので、助けてください。 ---- Minecraft Crash Report ---- // Why did you do that? Time: 2025-01-12 22:33:39 JST Description: Rendering Item Stack java.lang.IllegalArgumentException: ItemStack must be for default leaves. at com.google.common.base.Preconditions.checkArgument(Preconditions.java:122) at forestry.arboriculture.models.ModelDefaultLeaves.getInventoryKey(ModelDefaultLeaves.java:76) at forestry.arboriculture.models.ModelDefaultLeaves.getInventoryKey(ModelDefaultLeaves.java:40) at forestry.core.models.ModelBlockCached.getModel(ModelBlockCached.java:56) at forestry.core.models.ModelBlockDefault$DefaultItemOverrideList.handleItemState(ModelBlockDefault.java:171) at buildcraft.lib.client.render.ItemRenderUtil.renderItemStackInternal(ItemRenderUtil.java:155) at buildcraft.lib.client.render.ItemRenderUtil.renderItemStack(ItemRenderUtil.java:133) at buildcraft.transport.client.render.PipeFlowRendererItems.render(PipeFlowRendererItems.java:75) at buildcraft.transport.client.render.PipeFlowRendererItems.render(PipeFlowRendererItems.java:38) at buildcraft.transport.client.render.RenderPipeHolder.renderFlow(RenderPipeHolder.java:90) at buildcraft.transport.client.render.RenderPipeHolder.renderContents(RenderPipeHolder.java:78) at buildcraft.transport.client.render.RenderPipeHolder.renderTileEntityFast(RenderPipeHolder.java:43) at buildcraft.transport.client.render.RenderPipeHolder.renderTileEntityFast(RenderPipeHolder.java:27) at net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher.func_192854_a(TileEntityRendererDispatcher.java:198) at net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher.func_180546_a(TileEntityRendererDispatcher.java:157) at net.minecraft.client.renderer.RenderGlobal.redirect$zbi000$tileEntityRender(RenderGlobal.java:3783) at net.minecraft.client.renderer.RenderGlobal.func_180446_a(RenderGlobal.java:1031) at net.minecraft.client.renderer.EntityRenderer.func_175068_a(EntityRenderer.java:1808) at net.minecraft.client.renderer.EntityRenderer.func_78471_a(EntityRenderer.java:1621) at net.minecraft.client.renderer.EntityRenderer.func_181560_a(EntityRenderer.java:1390) at net.minecraft.client.Minecraft.func_71411_J(Minecraft.java:1119) at net.minecraft.client.Minecraft.func_99999_d(Minecraft.java:3942) at net.minecraft.client.main.Main.main(SourceFile:123) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) at net.minecraft.launchwrapper.Launch.main(Launch.java:28) A detailed walkthrough of the error, its code path and all known details is as follows: --------------------------------------------------------------------------------------- -- Item being rendered -- Stack Count: 1 Item Class: class forestry.arboriculture.items.ItemBlockLeaves Item ID: forestry:leaves.default.fruit.0 Item Meta: 11 Item NBT: null -- Block Entity Details -- Name: buildcrafttransport:pipe_holder // buildcraft.transport.tile.TilePipeHolder Block type: ID #2606 (tile.pipeHolder // buildcraft.transport.block.BlockPipeHolder // buildcrafttransport:pipe_holder) Block data value: 0 / 0x0 / 0b0000 Block location: World: (-400,73,-129), Chunk: (at 0,4,15 in -25,-9; contains blocks -400,0,-144 to -385,255,-129), Region: (-1,-1; contains chunks -32,-32 to -1,-1, blocks -512,0,-512 to -1,255,-1) Actual block type: ID #2606 (tile.pipeHolder // buildcraft.transport.block.BlockPipeHolder // buildcrafttransport:pipe_holder) Actual block data value: 0 / 0x0 / 0b0000 Block Entity NBT: {x:-400,wireManager:{parts:[I;]},y:

    • 回答数1
質問する