人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

WindowsXPでファイルパス長が256文字を超えるファイルの一覧を取得したいです。

WindowsXPで扱えるファイルパス長は256文字までの認識です。
256文字を超えたファイルがある場合、削除やコピーなどができないようになってしまいます。

上記のようなファイルを探すためにVBScriptにて256文字を超えたファイルが存在する
対象フォルダを再回帰的に検索し、ファイル一覧を出したのですが、256文字を超えている
ファイルは検索できず、一覧に表示されない状態です。

256文字を超えたファイルを検索し、パスとファイル名を検索できる方法はありますでしょうか
出来ましたらVBScriptのサンプルを作っていただけると幸いです。

また、ポイントにつきましては基本的には1番回答に近いものにあてさせていただきます。

●質問者: gocnia3
●カテゴリ:コンピュータ インターネット
○ 状態 :キャンセル
└ 回答数 : 4/4件

▽最新の回答へ

1 ● きゃづみぃ

const ForReading = 1
' --------------------------------------------------------------------
' フォルダ内のファイル一覧の取得
Redim path_list(0)
GetFDate "c:\", path_list

' フォルダ内のファイル一覧の出力
FListWrite "c:\out.txt", path_list
' --------------------------------------------------------------------

' フォルダ内のファイル一覧の取得----------
Public Sub GetFDate(ByVal fol_path, ByRef path_list())
 Set fso = CreateObject("Scripting.FileSystemObject")

 For Each f In fso.GetFolder(fol_path).files
  ' ファイルのPATH、更新日時、サイズの設定
 ReDim Preserve path_list(UBound(path_list) + 1)
if len(f.path)>255 then
 path_list(UBound(path_list)) = f.path
end if
  ' ------------------------------------------------------
 Next

 For Each f In fso.GetFolder(fol_path).SubFolders
 GetFDate f.path, path_list
 Next

 Set fso = Nothing
End Sub
' --------------------------------------------------------------------

' フォルダ内のファイル一覧の出力----------
Private Sub FListWrite(ByVal out_path, ByRef path_list())
 Set fso = CreateObject("Scripting.FileSystemObject")
 Set txf = fso.CreateTextFile(out_path, True)
 For i = 1 To UBound(path_list)
if len(path_list(i))>0 then
 txf.WriteLine path_list(i)
end if
 Next
 txf.Close
 Set txf = Nothing
 Set fso = Nothing
End Sub
' --------------------------------------------------------------------

ドライブと 出力ファイル名などを 変更して 使ってみてください。

http://homepage2.nifty.com/nonnon/Chinamini/20100001/20101012.html


gocnia3さんのコメント
>GetFDate "c:\", path_list >FListWrite "c:\out.txt", path_list 上記を変更しましたが動きませんでした。 もうちょっと確認してみますが 異なるところを変更する必要がある場合はお伝え頂けますか

きゃづみぃさんのコメント
テキストファイルに拡張子は vbsにしてください。 たくさんファイルがあると 動作に時間がかかります。 エラーが出なければ 動いてると思われます。

きゃづみぃさんのコメント
それから 手動で 256文字以上のファイル名のファイルを作成して それが抽出できるか確認してみてください。

gocnia3さんのコメント
フォルダ名を含めて256文字以上にして実行しましたが、出力されません ちなみに >if len(f.path)>255 then を >if len(f.path)<255 then とすると256文字以上のファイル以外が書き出されますので取得できていないと思います

きゃづみぃさんのコメント
私のほうでは 256文字以上のファイルを作成して 確認しましたが 環境が違うのかな?

gocnia3さんのコメント
256文字のファイルは作成できますが、C:直下だと見れるんだと思います。 ファイル名は100文字程度、入っているフォルダを200文字とかにしていただければ おなじかんきょうとなります

きゃづみぃさんのコメント
私は フォルダ内に作成しました。 万が一 削除できない場合は、フォルダごと 削除しようかと思って。 ちょっと確認してみます。

きゃづみぃさんのコメント
あと、 >ファイル名は100文字程度、入っているフォルダを200文字とかにしていただければ これだと ファイル名は 100文字なので 私が作ったものだと 出力されません。

gocnia3さんのコメント
あくまでフルパス指定なので要件とちょっとずれてます ありがとうございました

2 ● うぃんど

どのような状況でそうなったのかにもよると思いますが、
ショートファイルネームでも取得できませんか?
(targetFolderとoutputFileの二箇所はそちらの環境に合わせて適宜変更)

Option Explicit

' 宣言
Dim FS1, targetFolder, folder, file, subFolder
Dim FS2, outputFile
Dim fileList

' 初期設定
targetFolder = "z:\"
outputFile = "filelist.txt"

' ファイル一覧取得
Set FS1 = WScript.CreateObject("Scripting.FileSystemObject")
Set folder = FS1.GetFolder(targetFolder)

Sub addFileList(folder)
 For Each file In folder.Files
 ReDim Preserve fileList(UBound(fileList) + 1)
 fileList(UBound(fileList)) = file.ShortName & ":" & file.Name
 Next
 For Each subFolder In folder.SubFolders
 addFileList(subFolder)
 Next
End Sub

fileList = array()
addFileList(folder)

' ファイル出力
Set FS2 = FS1.OpenTextFile(outputFile, 2, True)
FS2.Write join(fileList, vbCrLf)

' CloseやNothingなどは省略

gocnia3さんのコメント
まだ実行してないですが ショートファイルネーム了解しました。 ただショートファイルネームで取得するとそもそも256文字を超えているものが どれかわからなくなります。 あくまで256文字を超えているものがどれかを知りたいです。

うぃんどさんのコメント
規定の文字数を超えている場合は正常に取得することが出来ませんので、 ショートファイルネームでのアクセスを提案してみたのですが、それすらも、 ターゲットのファイルシステムがショートファイルネームをサポートしていなければ、 そもそも出来ない話なので、まずは目視確認用のコードを提示しました。 目視確認できたと仮定し、 フルパスでアクセスできるかどうかのテストを組み込む例も提示しておきます >|vb| 変更前 fileList(UBound(fileList)) = file.ShortName & ":" & file.Name 変更後 If FS1.FileExists(file.Path) = True Then fileList(UBound(fileList)) = "OK" & file.Path Else fileList(UBound(fileList)) = "NG" & file.Path End IF ||< 関連するプロパティとしては下記のようなものがあります |* |ロング|ショート| |*ファイルネーム|file.Name|file.ShortName| |*パス|file.Path|file.ShortPath|

gocnia3さんのコメント
実施したのですが目視確認もできませんでした ありがとうございました

3 ● beast65

ショートファイルで、しゅとくできたら、
取得してみてください

Option Explicit

' 宣言
Dim FS1, targetFolder, folder, file, subFolder
Dim FS2, outputFile
Dim fileList

' 初期設定
targetFolder = "z:\"
outputFile = "filelist.txt"

' ファイル一覧取得
Set FS1 = WScript.CreateObject("Scripting.FileSystemObject")
Set folder = FS1.GetFolder(targetFolder)

Sub addFileList(folder)
For Each file In folder.Files
ReDim Preserve fileList(UBound(fileList) + 1)
fileList(UBound(fileList)) = file.ShortName & ":" & file.Name
Next
For Each subFolder In folder.SubFolders
addFileList(subFolder)
Next
End Sub

fileList = array()
addFileList(folder)

' ファイル出力
Set FS2 = FS1.OpenTextFile(outputFile, 2, True)
FS2.Write join(fileList, vbCrLf)

' CloseやNothingなどは省略


4 ● beast65

ショートファイルで、しゅとくできたら、
取得してみてください

Option Explicit

' 宣言
Dim FS1, targetFolder, folder, file, subFolder
Dim FS2, outputFile
Dim fileList

' 初期設定
targetFolder = "z:\"
outputFile = "filelist.txt"

' ファイル一覧取得
Set FS1 = WScript.CreateObject("Scripting.FileSystemObject")
Set folder = FS1.GetFolder(targetFolder)

Sub addFileList(folder)
For Each file In folder.Files
ReDim Preserve fileList(UBound(fileList) + 1)
fileList(UBound(fileList)) = file.ShortName & ":" & file.Name
Next
For Each subFolder In folder.SubFolders
addFileList(subFolder)
Next
End Sub

fileList = array()
addFileList(folder)

' ファイル出力
Set FS2 = FS1.OpenTextFile(outputFile, 2, True)
FS2.Write join(fileList, vbCrLf)

' CloseやNothingなどは省略

関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ