質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
ファイルI/O

ファイルI/Oは、コンピューターにおけるファイルの入出力です。これは生成/削除やファイルを読み込んだり、出力をファイルに書き込むようなディレクトリやファイルの運用を含みます。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1088閲覧

フォルダ内のファイルを列挙し、その進捗状況を知る方法を教えてください

thirdesr34

総合スコア36

ファイルI/O

ファイルI/Oは、コンピューターにおけるファイルの入出力です。これは生成/削除やファイルを読み込んだり、出力をファイルに書き込むようなディレクトリやファイルの運用を含みます。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2021/06/12 13:27

前提・実現したいこと

ファイルを列挙するプログラムを作成しています。
下記のコードで、サブフォルダの中も含めてすべてのファイルのURLを取得することができていますが、フォルダの内容によっては非常に時間がかかるため、進捗状況を知りたいと考えています。進捗は最終的にUIProgressViewなどに反映し、ユーザーに通知します。

(とはいえ、恐らくファイルを列挙し終えるまで正確な総数が分からないと思いますので、すべてのフォルダ階層に対する進捗を逐一取得するのではなく、例えばルートフォルダからひとつ下のフォルダのみ進捗を考慮し、それを全体の進捗に替えるなどの何らかの方法があると思いますが、具体的な実装に至っていません。)

上記の想定にこだわらず、ファイル列挙の進捗を得る方法があれば教えてください。
よろしくお願いします。

現状のソースコード

Swift

1if let enumerator = FileManager.default.enumerator(at: rootFolderURL, includingPropertiesForKeys: [.isRegularFileKey], options: [.skipsHiddenFiles, .skipsPackageDescendants]) { 2 for case let fileURL as URL in enumerator { 3 print(fileURL.path) 4 } 5}

補足情報(FW/ツールのバージョンなど)

Xcode 12.5
Swift 5

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

下記のような形で擬似的に進捗を得ることができました。
サブフォルダ毎にファイル数の偏りがない場合にうまく機能しますが、偏りがあると進捗が止まって見えるので、UIActivityIndicatorViewと併用した方が良さそうです。

Swift

1progressView?.progress = 0 2DispatchQueue.global(qos: .utility).asyncAfter(deadline: .now()) { 3 //一階層下のサブフォルダのURLを記録する配列 4 var firstSubDirectories:[URL] = [] 5 if let enumerator = FileManager.default.enumerator(at: selectedURL, includingPropertiesForKeys: [.isDirectoryKey], options: [.skipsHiddenFiles, .skipsPackageDescendants, .skipsSubdirectoryDescendants]) { 6 for case let enumuratedURL as URL in enumerator { 7 firstSubDirectories.append(enumuratedURL) 8 } 9 } 10 print("There are (firstSubDirectories.count) subdirectories.") 11 12 //すべてのファイルのURLを記録する配列 13 var totalURL:[URL] = [] 14 for (index, subdirectoryURL) in firstSubDirectories.enumerated() { 15 if(index != 0) { 16 let percentage = Float(index) / Float(firstSubDirectories.count) 17 DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) { 18 print("index:(index), (percentage) percent completed.") 19 self.progressView?.progress = percentage 20 } 21 } 22 if let enumerator = FileManager.default.enumerator(at: subdirectoryURL, includingPropertiesForKeys: [.isRegularFileKey], options: [.skipsHiddenFiles, .skipsPackageDescendants]) { 23 for case let enumuratedURL as URL in enumerator { 24 totalURL.append(enumuratedURL) 25 } 26 } 27 } 28 print("There are (totalURL.count) files including subdirecotires.") 29}

投稿2021/06/17 08:37

thirdesr34

総合スコア36

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問