閉じていないファイルがある場合、フォルダは削除されない - ページ 7

 

明日は、この問題を完全に再現するスクリプトを作ってみます。

だから、ここで「フィクション」をやっていると言われることはないだろう)。

皆さん、快く解決にご協力いただき、本当にありがとうございました。))

 

このようなフローティングエラーが発生しました(シーケンスは記述されており、ライブラリ.ex5ファイルが添付されていました)。このようなことを記録するのは難しい

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

バグ、バグ、質問

A100, 2016.08.04 00:05

Expert Advisorでファイルを開くとエラーになります。たとえば、どうでしょう。

1.いくつかの無関係なコード "を削除する(下記参照)。

2.または削除 ::Sleep(1000)

エラーはない

//Test.mq5
#import "Test001.ex5"
        string f( string file );
#import
string __Period() { return StringSubstr( EnumToString((ENUM_TIMEFRAMES)Period()), 7 ); }
void OnInit()
{
        Print( Symbol(), ",", __Period(), ", результат=", f( "test.txt" ));
}

アクションのシーケンス。

1.新規プロファイルを作成する(例:"Test")

2. 新しいチャートを2つ開き、Test.ex5 Expert Advisorをその両方にアタッチします(写真参照)。

4.他の既存のプロファイルを選択する

5.テスト」プロファイルを選択する

の結果です。

一方、Test001.mq5はこのような感じです。

//Test001.mq5
#property library
//---
//здесь некий код не имеющий отношения к делу
//---
string f( string file ) export
{
        ::ResetLastError();
        int hFile = ::FileOpen( file, FILE_READ | FILE_SHARE_READ | FILE_TXT | FILE_ANSI | FILE_COMMON );
        if ( hFile == INVALID_HANDLE )
                return ::StringFormat( "Error(%d): Не был открыт файл: %s", ::GetLastError(), file );
        ::Sleep( 1000 );
        ::FileClose( hFile );
        return "OK";
}

添付のライブラリファイルで今試してみました:結果は同じです(テストファイルは両方のEAで別々に開かれ、同時に開かれると、一方のEAがエラーを報告します)。
2017.08.28 23:40:43.623 Test (EURUSD,M15) EURUSD,M15, result=OK
2017.08.28 23:40:52.389 Test (GBPUSD,M15) GBPUSD,M15, result=OK

2017.08.28 23:41:14.387 Test (GBPUSD,M15) GBPUSD,M15, result=Error(5004): File was not opened: test.txt
2017.08.28 23:41:15.484 Test (EURUSD,M15) EURUSD,M15, result=OK


 

申請番号#1530548を発見したが、コメントがない - 既に修正されている可能性がある。そうでない場合は、再度レビューをお願いします

 

Реter Konow:

そのファイルを 私のアプリケーション(ファイルナビゲータ)で開くと、別のフォルダに上書きされます。

ファイルを読み込むために開くとファイルハンドルを取得 します。

タグはコノウです

上書きした後、ファイルを閉じる 必要があるのですが、それができず(ハンドルがない)、ただファイルを消去しています。

他のファイルに書き込むには、他のファイルのハンドルが必要なので、それを別の変数に格納するのは理にかなっています。新しいファイルに書き込んだ後,2つのファイルのハンドルを2つの変数に格納し,そのハンドルを使って両方のファイルを閉じます.

タグコノウ

いつ、誰が作ったかわからないファイルなので、ハンドルがないのです。

John DoeとJohn Doeによって作成されたファイルであれば、どのアプリケーションでも使用されていない可能性が非常に高いです。何らかの目的でファイルを開いた場合は、すでに FileOpen 関数で取得したハンドルを持っているので、 フォルダを消去する前にそれを 閉じる必要があります。

コノウタグ

とはいえ、Filesフォルダ内に存在するファイルなので、他のフォルダにコピーしてから消去することも可能です。

あるアクセス可能なプログラムからmqlプログラムへファイルをコピーする場合、ファイルのハンドルは絶対に必要ではありません。

レグ・コノウ

しかし、コピーした後にそのファイルを閉じることはできません。ハンドルがない。

コピーした後は、ファイルは開いていないので閉じる必要はありません。

コノウタグ

このためか、ファイルを消去した状態でさらにFolderClean()を実行しても、うまくいきません。

これは絶対に間違いです。

レタグ・コノウ

Question: MQLプログラムでこのファイルのハンドルを取得するにはどうすればよいですか?

以上から、この質問は意味がない。ファイルハンドルは、ファイルを開くときにのみ取得し、ファイル ポインタがどこにあるか判断します FileTellとFileSeekは どこから読み書きを行うか、FileFlushは データを強制的にディスクにダンプします、もちろんファイルを閉じて他のアプリケーションが作業できるように解放するためでもあります。


全く偶然に、あなたの問題が何であるかを発見しました。

実験中は、エクスプローラや他のファイルマネージャでフォルダを開き、ファイルの作成と削除を監視します。また、一度ファイルを削除すると、そのフォルダはビジー状態のまま削除できなくなります。その結果

2017.08.29 09:42:15.657 Demo_FolderDelete (CADJPY,H4)   Не удалось удалить папку nonempty. Код ошибки=5024

しかし、フォルダーの削除に失敗した後、このフォルダーがビジー状態のままであることは、残念ながら事実です。これは今後、SDに申請する予定です。

ps; 残念ながら、私も実験中に失敗してしまいました。ファイルに書き込んだ後、データをディスクにリセットして、メモ帳で開こうとしたら、レスポンスで...(図)開こうとしたのを忘れてキャンセルしたのが、このフォルダを保持し、削除させなかった原因です。

まとめ:mqlファイルでも問題なし。

 

Alexey Viktorov:

まったくの偶然ですが、あなたの悩みが何であるかを発見しました。

実験中は、エクスプローラや他のファイルマネージャでフォルダを開き、ファイルの作成と削除を監視します。また、ファイルを削除しても、フォルダは占有されたままなので、削除できません。その結果

2017.08.29 09:42:15.657 Demo_FolderDelete (CADJPY,H4)   Не удалось удалить папку nonempty. Код ошибки=5024

しかし、フォルダーの削除に失敗した後、このフォルダーがビジー状態のままであることは、残念ながら事実です。 今後、SRに報告される予定です。

私は、全く別の状況でこの動作に遭遇したことがあります。削除のためにフォルダを開いたままにしておくと、プログラム/スクリプト/SVNなどがそのフォルダを削除できないことがあります。

そして、その解決策はいつも同じで、手動でそのフォルダを取り壊すことです。だから、端末やエディターの問題とは言い難い。

 
Rashid Umarov:

私は、全く別の状況でこの動作に遭遇したことがあります。削除のためにフォルダを開いたままにしておくと、プログラム/スクリプト/SVNなどがフォルダを削除できない結果になります。

そして、それは常に同じように扱われます - 与えられたフォルダを手動で取り壊すことです。だから、端末やエディターの問題とは言い難い。

少し後に補足しておきました。

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

フォルダ内に未閉のファイルがある場合、フォルダを削除しない。

アレクセイ・ビクトロフ さん 2017.08.29 08:55


ps; 残念ながら、私も実験中に失敗してしまいました。ファイルに書き込んだ後、データをディスクにリセットし、メモ帳で開こうとしたところ、開こうとしたのをキャンセルする...(図)という応答があり、それを忘れたためにフォルダを保持し、削除させなかったものです。

まとめ:mqlファイル でも問題なし。


この追記なしに私の投稿を引用したのは奇妙です。

 
Alexey Viktorov:

少し遅れて補足しました。


その追加なしに私の投稿を引用したのは奇妙なことです。

ただ、SDの返事は覚悟の上です。

 
Rashid Umarov:

ただ、SDの対応については、覚悟が必要です。

では、その理由を理解した上で、なぜSDからゴミを書き込むのか?ただ、「書くのを拒否した」と声高には言わなかったが......。誰の目にも明らかだと思ったからです。
 
Rashid Umarov:

私は、全く別の状況でこの動作に遭遇したことがあります。削除のためにフォルダを開いたままにしておくと、プログラム/スクリプト/SVNなどがフォルダを削除できなくなるのです。

そして、その解決策はいつも同じで、手動でそのフォルダを取り壊すことです。だから、端末やエディターの問題とは言い難い。

また、ファイルではなく、フォルダを ファイルマネージャで開いても 、mqlによる削除には影響しません。

 
Alexey Viktorov:

1.ファイルを読み込むために開くときに 、ファイルハンドルを取得 する。

2.別のファイルに書き込むには、別のファイルハンドルが必要なので、別の変数に格納するのが合理的です。新しいファイルに書き込んだ後,2つのファイルのハンドルが2つの変数に格納され,このハンドルに従って両方のファイルが閉じられる.

3.いつ、誰が作ったかわからないファイルであれば、どのアプリケーションにも占有されていない可能性が非常に高い。何らかの目的でファイルを開いている場合は、すでに FileOpen ハンドルを持っているので、 フォルダをクリアする前にそれを 閉じる必要があります。

4.ある利用可能なプログラムからmqlにファイルをコピーする場合、ファイルハンドルは絶対に必要ではありません。

5.ファイルをコピーすると、そのファイルは開かなくなり、閉じる必要はありません。


1 ハンドルはFileClose関数にのみ必要です。ファイルを開けない。私より先に作られたものです。コピーして消すだけです。ハンドルがないので、閉じることができない。

2.コピー(FileCopy)、移動(FileMove)には、ファイルハンドルは必要ありません。ドキュメントをご参照ください。

3.他の人が作成したファイルをFileOpen関数で開くと、そのハンドルが取得できない。どのハンドルになるかは全く未定です。彼のものかもしれないし、まったく別のものかもしれない。他人のファイルのハンドルを取得して、コピー操作の後にFileCloseできるようにしようとしたのです。うまくいかなかった。

4.コピーする場合は、ハンドルは不要です。問題なくコピーできています。しかし、そのファイルは自動的にコピー用に開かれます。さらに、ハンドルがないので、FileCloseで閉じることもできません。コピーしたファイルを消去した後、FolderCleanが動作しないのはこのためと思われます。

5.コピーした後、ファイルが開いていないことをどうやって確認するのですか?FileOpen関数で明示的に開いたわけではなく、一緒にコピーされていた、つまり開いているということです。そのため、コピーした後でも、消去した後でも、開いたままになっています。おそらく。