4

WindowsでMatlab7.8.0を実行しています。

dos()現在のディレクトリにファイルを作成するために使用する外部ユーティリティを呼び出しています。私はファイルが正しく作成されていますが、それぞれとを返すexistまたはによって表示されません。ファイル名は正しいです!fopen0-1

>> pwd
ans = 
I:\

>> ls

file1.asc     file2.asc     file3.asc

>> exist('file1.asc')           % this file was there before
ans =
     2

>> exist('file2.asc')           % this file is newly created
ans =
     0

奇妙で問題のあるファイル名ではないことを確認するために、Cygwinシェルから確認しました。

/cygdrive/i/ $ if [ -f file2.asc ]; then echo "OK"; fi
OK

したがって、ファイルは良好です。名前を変更してみました

/cygdrive/i/ $ mv file2.asc test

とMatlabで

>> ls

file1.asc      file3.asc      test

>> exist('test')
ans =
     0

Matlabを終了して再起動すると、正常に動作します。ただし、ファイルを動的に作成してからアクセスする必要があります。

4

4 に答える 4

7

とても神秘的です。

あなたは試すことができます:

  • それが役立つかどうかを確認するためのrehashコマンド。
  • 2つの引数のバージョンが存在します:exist('foo.txt'、'file')
于 2010-10-15T01:00:08.113 に答える
6

Matlabのexist()コマンドは、単純なファイルシステム操作ではありません。また、変数や関数なども調べます。I:を使用しているので、これはネットワークドライブであると想定しており、Jonasが言及しているdirコンテンツのキャッシュの問題が発生している可能性があります。

nsandersの2つの引数が存在する()またはJonasの変更通知の修正が機能しない場合の、他のいくつかの回避策があります。

相対パスやpwdの代わりに、「fopen('I:\ file2.asc')」のようなファイルへの絶対パスを使用してみてください。Matlabは、修飾されていないファイル名をexist()とfopen()の両方の「部分パス」として扱い、ディレクトリ情報のキャッシュと相互作用します。Ls()は部分パスでは機能しないため、ファイルを表示でき、他の関数は表示できない可能性があります。

Matlab内からJavaを使用して、より簡単なファイル存在テストを実行できます。

java.io.File('file2.asc').exists()

または、ls()コマンドが必要なファイルを表示しているので、lsの上にファイルの存在チェックを実装するだけです。

ismember({'file2.asc'}, ls())

ismember()をcharレベルではなく文字列レベルで動作させるには、「{}」が必要です。

それでも読みにくい場合は、Matlab内からJavaを使用して低レベルの読み取りを実行してみてください。これにより、特に問題が発生しているのがMatlabのI / O関数なのか、プロセス自体がファイルへのアクセス権を欠いているのかがわかります。これを試して。それからcharを取得した場合、それはMatlab.exeプロセスがファイルを見ることができることを意味します。

istr = java.io.FileInputStream('file2.asc')
c = char(istr.read())
于 2010-10-15T14:39:25.783 に答える
2

Windowsでは、警告をオフにするまで、起動時に変更ハンドル通知の警告が表示されていました。現在7.8はありませんが、デフォルトで警告がオフになっている可能性があります。

MathWorksサイトで説明されているように、Windowsで変更通知ハンドルがなくなると、ディレクトリのコンテンツが変更されたかどうかを適切に「検知」できず、問題が発生する可能性があります。

于 2010-10-15T01:34:51.020 に答える
1

MATLABがエクスプローラーと同じユーザーとして実行されていることを確認しますか?MATLABを実行するために昇格されたアクセス許可が必要な場合、ドライブマッピングが異なる可能性があり、I:\ドライブがマップされていないことがわかります。

これを修正するには、昇格されたアクセス許可の下でI:ドライブを何らかの方法でマップする必要があります。

于 2010-10-15T01:00:57.707 に答える