HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
0328
DoubleQuoteドライブ内の全ファイル名とフォルダ名を取得するとエラーになる3解決


DoubleQuote

リンク

2017/3/28(Tue) 20:31:37|NO.78699

ドライブ内のフォルダ名とファイル名を一覧で取得しようと思っています。

かなり前の記事ですが、

ディレクトリ下の全ファイルパスを取得
http://hsp.tv/play/pforum.php?mode=pastwch&num=6015

こちらの記事のNO.6064
kz3様のスクリプトを参考に組んでみました。

参考スクリプトはフォルダ名のみですのでファイル名も取得するように改造してあります。

↓考えたスクリプト

#include "hspda.as" sdim now_dir, 260 // フォルダ取得用 sdim now_file, 260 // ファイル取得用 chdir "E:" g_list = dir_cur + "\n" // フォルダ一覧 g_folder_cur = 0: g_folder_max = 1 // フォルダの現在値 / 最大数 objsize ginfo_winx, ginfo_winy // 結果表示用 listbox chk_list, 0, g_list // フォルダ一覧の取得 repeat // 取得する一覧がなくなったら終了 if ( g_folder_max == g_folder_cur ) : break // 一覧の中から順次フォルダを取り出して掘り進める notesel g_list noteget now_dir, g_folder_cur //if ( instr(now_dir,0,"\\\\") != -1 ) :g_folder_cur++: continue // VOLUMEなんとかファイルで\\という文字列が出る?? chdir now_dir g_folder_cur++ // カレントディレクトリのフォルダ一覧を取得 dirlist s_list, "*.*", 5 ret = stat: g_folder_max += ret // 取得したカレントディレクトリのフォルダを一覧に追加 if ret { notesel s_list repeat ret noteget now_file, cnt g_list += dir_cur + "\\" + now_file + "\n" loop } loop ; 一覧更新 objprm 0, g_list sdim _filelist,1024 sdim filelist,65536*8 notesel g_list repeat notemax notesel g_list noteget dir,cnt dirlist _filelist,dir+"\\*.*",3 notesel _filelist repeat notemax noteget filename,cnt filelist += dir+"\\"+filename+"\n" loop loop filelist += g_list sortnote filelist objprm 0,filelist notesel filelist title "Fin : アイテム数 : "+notemax+"個" stop

検証においてはEドライブを対象としています。
6行目の
chdir "E:"
こちらを
chdir "E:\\hogehoge"
等と指定すると問題無く動くのですが、
chdir "E:"のようにドライブ全体を指定するとうまく動きません。
これは、システムフォルダなどが出てくるとうまく取得できないのでしょうか?

また、chdir "E:\\"と記述することと、chdir "E:"と記述することの違いなど、教えて頂けると有り難いです。
以上、よろしくお願い致します。



この記事に返信する


スペース

リンク

2017/3/28(Tue) 23:40:58|NO.78703

私の環境ではSystem Volume Informationというシステムフォルダをカレントディレクトリに指定する時にエラーが発生しました。
エクスプローラーで開こうとしてもアクセスが拒否されます。開くには権限の設定を変更しないといけないようです。

で、dirlistってシステムフォルダを除く全てのフォルダを取得するモードないんですね・・・
ただ、システムフォルダを取得するモードはあるので、両方取得して被ってるフォルダを除外するという力技で除外してみました。
もっといい方法があると思うので、後は他の方に任せます。


// カレントディレクトリのフォルダ一覧を取得 dirlist s_list_2, "*", 6:ret2=stat:s_list_2="\n"+s_list_2+"" dirlist s_list, "*", 5:ret = stat g_folder_max += ret-ret2 // 取得したカレントディレクトリのフォルダを一覧に追加 if ret { notesel s_list repeat ret noteget now_file, cnt if instr(s_list_2,0,"\n"+now_file+"\n")=-1:g_list += dir_cur + "\\" + now_file + "\n":else loop }



掘木

リンク

2017/3/29(Wed) 00:10:46|NO.78704

カレントディレクトリにするとエラーになるなら、
カレントディレクトリにしなくてすむ方法を考えたほうが早くないか。

…というか、なんでファイルリスト作る時とディレクトリリスト作る手続きが違うん?
ファイルリスト作る時はカレントディレクトリ変更してないよね?

// 取得する一覧がなくなったら終了 if ( g_folder_max == g_folder_cur ) : break // 一覧の中から順次フォルダを取り出して掘り進める notesel g_list noteget now_dir, g_folder_cur g_folder_cur++ // カレントディレクトリのフォルダ一覧を取得 dirlist s_list, now_dir+"\\*", 5 ret = stat: g_folder_max += ret // 取得したカレントディレクトリのフォルダを一覧に追加 if ret { notesel s_list repeat ret noteget now_file, cnt g_list += now_dir + "\\" + now_file + "\n" loop }
パスと、その中のファイルやフォルダ名の連結は専用のAPIを使うほうが本来はいいんだろうけど、
元々がそうなっていないので放置で。
https://msdn.microsoft.com/ja-jp/library/windows/desktop/bb773571(v=vs.85).aspx
(思わぬバグの原因になったりする。出力結果すでに怪しいし。)



DoubleQuote

リンク

2017/3/29(Wed) 08:55:32|NO.78708

スペースさま、堀木さま

ご指導ありがとうございます。
参考にさせて頂きなんとか動くように作ることが出来ました。
フォルダ名の最後に\\を付けないと動かなかったり、ダブって\\\\と表示されたりと
いろいろ苦労しました。ありがとうございました。
最終的なソースコードを貼っておきます。


#include "hspda.as" gsel 0,-1 sdim now_dir, 1024 // フォルダ取得用 sdim now_file, 1024 // ファイル取得用 chdir "E:\\" winx = 70 * 16 winy = 70 * 09 screen 2,winx,winy,,(ginfo_dispx-winx)/2,(ginfo_dispy-winy)/2 title ""+dir_cur+"内のフォルダ構造取得中..." g_list = dir_cur + "\n" // フォルダ一覧 g_folder_cur = 0: g_folder_max = 1 // フォルダの現在値 / 最大数 objsize ginfo_winx, ginfo_winy // 結果表示用 listbox chk_list, 0, g_list // フォルダ一覧の取得 repeat // 取得する一覧がなくなったら終了 if ( g_folder_max == g_folder_cur ) : break // 一覧の中から順次フォルダを取り出して掘り進める notesel g_list noteget now_dir, g_folder_cur g_folder_cur++ // フォルダ一覧を取得 dirlist s_list, now_dir+"\\*.*", 5 ret = stat : g_folder_max += ret // 取得したフォルダを一覧に追加 if ( ret ) { notesel s_list repeat ret noteget now_file, cnt //g_list += now_dir +"\\"+ now_file + "\n" g_list += now_dir + now_file + "\\\n" // 調整箇所 loop } loop title ""+dir_cur+"内のファイル名取得中..." sdim _filelist,1024 sdim filelist,65536*8 notesel g_list repeat notemax notesel g_list noteget dir,cnt dirlist _filelist,dir+"\\*.*",3 notesel _filelist repeat notemax noteget filename,cnt filelist += dir+filename+"\n" loop loop // 一覧更新 title "一覧データ更新中..." filelist += g_list sortnote filelist objprm 0,filelist notesel filelist title ""+dir_cur+"内のファイル取得が終了しました : アイテム数 : "+notemax+"個" stop



ONION software Copyright 1997-2021(c) All rights reserved.