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

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

新規登録して質問してみよう
ただいま回答率
85.48%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

1152閲覧

GetFolderメソッドで取得したFilesに特定のファイルのみが含まれない

ot2os

総合スコア23

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

1クリップ

投稿2018/09/14 02:32

下記のコードで Flash Player のフォルダ内のファイル一覧を出力したところ、なぜかFlash32_~.ocxファイルのみ一覧に出ません。
他のファイルは正常に出力されます。

単純なコードなので原因、解消方法の検討がつかず、何かアドバイスを頂ければ幸いです。

lang

1Option Explicit On 2 3Module Module1 4 5 Sub Main() 6 getAllFPFiles() 7 End Sub 8 9 Sub getAllFPFiles() 10 Dim FSO As Object 11 Dim FPFolder As Object 12 13 'ファイルシステムオブジェクトを取得 14 FSO = CreateObject("Scripting.FileSystemObject") 15 16 'フォルダのパスよりファイル一覧を取得 17 FPFolder = FSO.GetFolder("C:\Windows\System32\Macromed\Flash") 18 19 '各ファイル名を出力 20 For Each MyFile In FPFolder.Files 21 Console.WriteLine(MyFile.Name) 22 Next 23 End Sub 24 25End Module

上記コードでの出力結果は下記の通り。

activex.vch
Flash.ocx
FlashUtil_ActiveX.dll
FlashUtil_ActiveX.exe
続行するには何かキーを押してください . . .

コマンドプロンプトで出力したファイル一覧は下記の通り。

C:\Windows\System32\Macromed\Flash>dir
ドライブ C のボリューム ラベルがありません。
ボリューム シリアル番号は XXXX-XXXX です

C:\Windows\System32\Macromed\Flash のディレクトリ

2018/09/13 17:37 <DIR> .
2018/09/13 17:37 <DIR> ..
2018/09/05 08:04 163,442 activex.vch
2018/09/05 08:04 28,891,720 Flash.ocx
2018/09/05 08:04 163,442 Flash32_99_0_0_999.ocx
2018/09/05 08:04 724,552 FlashUtil_ActiveX.dll
2018/09/05 08:04 1,008,200 FlashUtil_ActiveX.exe
5 個のファイル 30,951,356 バイト

※一部XXでマスク

検証環境は下記の環境で、問題のFlash32_~.ocxファイルは検証のため適当にactivex.vchファイルをコピーしてリネームして作ったものです。
しかし、他のPC内にある実際のFlash32_~.ocxファイルも同様に検出されない状態です。

OS:Windows10x64 Ver1803

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

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

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

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

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

guest

回答2

0

ベストアンサー

32ビットアプリの場合、C:\Windows\System32へのアクセスはC:\Windows\SysWOW64にリダイレクトされるみたいですね
x64ビルドを行うと、「C:\Windows\System32\Macromed\Flash」のファイルが列挙されます。
x86ビルドを行うと、「C:\Windows\SysWOW64\Macromed\Flash」のファイルが列挙されます。

コマンドプロンプトでも、C:\windows\SysWOW64\cmd.exeを実行して「dir c:\windows\system32\macromed\flash」と実行すると、WOW64にリダイレクトされます。

32ビットアプリで「C:\Windows\System32」にアクセスする場合「C:\Windows\sysnative」とすればアクセスできます。
ただこのパスは64ビットアプリではエラーとなります。

DisableWow64RedirectionにてWOW64へのリダイレクトを無効に出来ます。

VB.NET

1 <DllImport("kernel32.dll", EntryPoint:="Wow64DisableWow64FsRedirection")> 2 Public Function DisableWow64Redirection(ByRef output As IntPtr) As Boolean 3 End Function 4 5 <DllImport("kernel32.dll", EntryPoint:="Wow64RevertWow64FsRedirection")> 6 Public Function RevertWow64Redirection(ByRef handle As IntPtr) As Boolean 7 End Function 8 9 Sub Main() 10 Dim path As String = "C:\Windows\System32\Macromed" 11 12 'フォルダのパスよりファイル一覧を取得 13 Dim files As String() 14 Dim handle As IntPtr 15 16 'WOW64へのリダイレクトを無効にする 17 DisableWow64Redirection(handle) 18 files = System.IO.Directory.GetFiles(path, "*", System.IO.SearchOption.AllDirectories) 19 'WOW64へのリダイレクトを元に戻す 20 RevertWow64Redirection(handle) 21 22 '各ファイル名を出力 23 For Each MyFile In files 24 Console.WriteLine(MyFile) 25 Next 26 27 Console.ReadKey() 28 29 End Sub

上記ソースにて32ビットビルドでも64ビットビルドでもWindows\System32のファイルが列挙されました。

投稿2018/09/19 03:09

編集2018/09/19 04:41
YAmaGNZ

総合スコア10242

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

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

ot2os

2018/09/19 08:45

ソースコードまで提供いただきありがとうございます! 最初の質問時点のままのコードで"C:\Windows\SysWOW64\Macromed\Flash"内に"Flash32_99_0_0_123.ocx"を置いたところ、system32側の"Flash32_99_0_0_999.ocx"の方ではなく、SysWOW64側の"Flash32_99_0_0_123.ocx"の方が出力されました。 32bitアプリとの互換性を保つための挙動に気が付きませんでした。 ありがとうございました。
guest

0

.Netであれば、System.IO.Directory.GetFiles(指定フォルダ, ".")の方法で指定フォルダ内のファイルを列挙できますが、これでも同様の結果になるでしょうか?

※CreateObject("Scripting.FileSystemObject")は.Net以前の技術なので、もし上記で問題が解決するようでしたら.Netの方を使用することをお勧めします。

投稿2018/09/14 06:02

kenshirou

総合スコア772

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

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

ot2os

2018/09/14 07:34

ありがとうございます。 アドバイスを参考に下記のコードで実施しましたが、やはり該当のファイルのみ表示されませんでした。 Sub getAllFPFiles2() Dim FPFolder As Object 'フォルダのパスよりファイル一覧を取得 FPFolder = System.IO.Directory.GetFiles("C:\Windows\System32\Macromed\Flash", "*.*") '各ファイル名を出力 For Each MyFile In FPFolder Console.WriteLine(MyFile) Next End Sub 出力結果は下記の通り。 C:\Windows\System32\Macromed\Flash\activex.vch C:\Windows\System32\Macromed\Flash\Flash.ocx C:\Windows\System32\Macromed\Flash\FlashUtil_ActiveX.dll C:\Windows\System32\Macromed\Flash\FlashUtil_ActiveX.exe ちなみに、2018/8/20頃に最初のgetAllFPFilesと同じコードを実施した時は確か正常に出力されていたと思います。
kenshirou

2018/09/18 01:47

こちらでも、該当フォルダに"Flash32_99_0_0_999.ocx"というフォルダを作成して確認してみました。(OSは同じくWindows10x64 Ver1803 ) ご指摘の通り、このファイルだけ検索されていません。 ただし、試しに、C:\Windows\System32\Macromed\Flashフォルダを丸ごと別のフォルダ(例えばユーザのドキュメントフォルダ)内にコピーすると、"Flash32_99_0_0_999.ocx"が正しく検索されました。 その後色々と試した所、ファイル名が悪いということでもないようです。 ファイルのインデックス等の仕組みが異なるのか、ファイル情報がキャッシュされているのか、権限が異なるからなのか、原因は不明ですが、通常System32フォルダ内にユーザがファイルを配置することはないため、こういったフォルダに元々なかったファイルを検索すると、期待通りの動作をしないのかも知れません。
kenshirou

2018/09/18 03:48

ちなみに、検索できなかったファイルに対して、System.IO.File.Exists(検索できなかったファイルパス)でファイルの存在を確認した所、Falseが返ってきました。 通常、上記メソッドは、ファイルが見つからない場合にFalseを返すのですが、該当ファイルに対して適切なアクセス権がない場合もFalseを返すとのことです。 https://docs.microsoft.com/ja-jp/dotnet/api/system.io.file.exists?redirectedfrom=MSDN&view=netframework-4.7.2#System_IO_File_Exists_System_String_ これがファイル検索に失敗することに関係があるのかも知れません。 2018/8/20頃は問題なかったとのことですが、Windows側・Flash側で何か変更があったのかも知れません(Flashのフォルダ内の各ファイルのタイムスタンプが2018/9/5になっていました)。
ot2os

2018/09/18 08:40

わざわざ検証していただいてありがとうございます。 こちらも検証として該当ファイルに対して設定されているアクセス権ユーザー片っ端からフルコントロールの許可を入れても状況変わらずでした。 コマンドプロンプトですら普通にヒットするのに、なぜVB.net上からだとヒットしないのか謎ですね。
kenshirou

2018/09/19 02:46

そうなると、VB.Net側で手っ取り早く対象ファイルを検出するならば、VB側からcmd(コマンドプロンプト)のプロセスを呼び出して、対象フォルダのdirを行う(確か、dir /bでファイル名だけが出力されるので、この標準出力またはリダイレクトで出力内容を取得)が近道のようですね。 ただ、実際問題として、このようなファイルを.Net側で利用するケースは稀かも知れません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問