ファイルが存在するかどうかを検出するには、少なくとも 3 つの手法があります。
- ファイル属性を照会する
- 検索パターンの代わりに特定のファイル名で FindFile() を使用する
- ファイルを読み取りモードで開き、結果のエラーを確認します
上記のすべては、偽陰性に苦しんでいるようです。つまり、実際にはファイルが存在するのに、ネットワーク上の file-io の動作に問題があるか、ファイルのアクセス許可の問題が原因で、ファイルが存在しないと言われます。
ファイルがエクスプローラーに存在することを確認でき、そのファイルを削除できる顧客がいますが、そのファイルを表示しようとすると「アクセスが拒否されました」と表示されます。
この正確な動作を再現することに失敗しました。しかし、作成できるのは、ファイルが存在する状況ですが、アクセス許可が制限されているため、ユーザー資格情報の下にそのフォルダー内のファイルが表示されません。つまり、GetFileAttributes()、FindFile()、および fopen() は失敗を返します。つまり、そのファイルのファイルが見つかりません (しかし、別のアカウント (ネットワーク管理者など) で同じフォルダーを調べると、ファイルが間違いなく存在します)。
私のエンドユーザー(または誰か)がそのような状況でどのようになるかについては、私には不透明です. 私には具体的なアイデアがありません.ファイルが以前に開かれている間に停電が発生した可能性があります.ネットワークの不具合により、ファイルハンドルが外国のPCのデッドプロセスにロックされたままになっている可能性があります...?何がそのような状況を引き起こす可能性があるのか わからないので、私はただものを作っています.
ただし、私が実際に持っていないのは、Windows にクエリを実行して、「ファイル X が存在するかどうか」という事実を知る機能です。
ユーザーのアクセス許可に関係なく、その質問に正直に答える手法を知っている人はいますか (フォルダー自体の内容を照会することが許可されていると仮定します-私は不正アクセスのシナリオを求めていません-単なる「通常の」ユーザー) X はファイル Y を編集できませんが、ファイル Y が存在するかどうかを知りたがっています。
Hokay - これは奇妙になってきています。
2 回尋ねる限り、どのファイル検出手法を使用しても機能します。初めてはいつも「存在しない」と言われます。Second+ は、「はい、そこにありますが、開くことはできません」と教えてくれます。
問題のファイルは、Windows Server 2008 NTFS ドライブの共有フォルダーにあります。全員がフル コントロールで共有されます。顧客の問題をシミュレートするために、手動で「Everyone Deny Read」ACL をファイルに追加しました。したがって、読み取りを拒否しましたが、他のアクセスは拒否し、ファイルのみにアクセスし、共有やこのファイルが存在するフォルダーにはアクセスしませんでした。
(私は自分のソフトウェアやコマンド ライン ユーティリティではなく、Explorer を使用してこの変更を行いました)。
そのサーバーのローカル管理者アカウントからファイルが存在することがわかります。Windows 7で標準ユーザーとしてログインし、UACが有効で、昇格されていないエクスプローラー/アプリケーションであるローカルワークステーションからも存在することがわかりません。
ファイルの読み取りアクセスが明示的に拒否された場合、そのファイルはもはや表示されないように見えます (その拒否が適用されないアカウント、またはアクセスを確認するバックドアの方法を持つローカル管理者を除く)。ファイルにもかかわらず、ACL を拒否します)。
FindFirstFile、GetAttributes、CreateFile、_taccess_s、および PathFileExists を試しました。いずれの場合も、ファイルへの最初のアクセス試行では「ファイルが見つかりません」と表示されますが、2 回目の試行ではエラーは発生しません (ファイルが見つかりました)。
これらの結果を説明し始めることはできません。この時点で、ネットワーク ファイル共有をミックスから削除するために、すべてのテストをローカルで実行する必要があると思います。これらの結果は、(私にとっては)あまり意味がありません。
サーバー上のローカル管理者アカウントからのフォルダーの fltmc 出力:
Filter Name Num Instances Altitude Frame
------------------------------ ------------- ------------ -----
aksdf 8 145900 0
luafv 1 135000 0