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

 
Rashid Umarov:

OOP vs 手続き型プログラミングの スレッドで、あなたの「私はすべての手を書き留めている」という言葉を思い出しました 。 このスレッドで、あなたは信用できないと確信したところ です。

証拠も詳細もない。サービスデスクに手紙を出す必要はない。


フォルダの削除に関する私の問題はまだ解決していません。スクリプトは動くのですが、まだ原因がわかっていません。


いろいろな可能性がありますね。私のせいかもしれないし、そうでないかもしれない。問題解決に必要な情報を常に提供できるようにしています。


servicedekへの感想は、決して苦情ではありません。

 
Rashid Umarov:

OOP vs 手続き型プログラミングの スレッドで、あなたの「手は全部書いてある」を思い出しました 。 このスレッドで、あなたは信用できないと確信したところ です。

どんな動きをするのか、なぜ私が信用できないと思うのか、わからない。理由をつけたかもしれないが、いつどこでかははっきり覚えていない。

いずれにせよ、私に対する態度を率直に述べていただき、ありがとうございました。知らないよりは知っていたほうがいい。

 

本当に理解してくれているのだろうか、「Harmful Advice - How not write to Service Desk」を見事にやり遂げた。

 
Rashid Umarov:

本当に伝わっているのでしょうか、「Harmful Advice - How not write to Service Desk」の素晴らしい出来栄えです。


残念なことに、私はそれを手に入れられませんでした。なるべくわかりやすく、具体的にメッセージを伝えるようにしました。私は、詳細、GIFファイル、スクリプトのコードをコメントしました。では、具体的に何がいけなかったのか?

 

本当にヘルプを読んで、正しくコードを変更できないのか?そのうえで、どうして違う態度を要求できるのか。以下は、ヘルプにあるコードで、追加した部分を黄色でハイライトしています。

//+------------------------------------------------------------------+
//|                                                Test_FileOpen.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- неправильный способ открытия файла
   string terminal_data_path=TerminalInfoString(TERMINAL_DATA_PATH);
   string filename=terminal_data_path+"\\MQL5\\Files\\"+"fractals.csv";
   int filehandle=FileOpen(filename,FILE_WRITE|FILE_CSV);
   if(filehandle<0)
     {
      Print("Неудачная попытка открыть файл по абсолютному пути");
      Print("Код ошибки ",GetLastError());
     }
//--- правильный способ работы в "файловой песочнице"
   ResetLastError();
   filehandle=FileOpen("fractals.csv",FILE_WRITE|FILE_CSV);
   if(filehandle!=INVALID_HANDLE)
     {
      FileWrite(filehandle,TimeCurrent(),Symbol(),EnumToString(_Period));
      FileClose(filehandle);
      Print("FileOpen OK");
     }
   else Print("Операция FileOpen неудачна, ошибка ",GetLastError());

//--- еще один пример с созданием вложенной директории в MQL5\Files\
   string subfolder="Research";
   filehandle=FileOpen(subfolder+"\\fractals.txt",FILE_WRITE|FILE_CSV);
   if(filehandle!=INVALID_HANDLE)
     {
      FileWrite(filehandle,TimeCurrent(),Symbol(),EnumToString(_Period));
      FileClose(filehandle);
      Print("Файл должен быть создан в папке "+terminal_data_path+"\\"+subfolder);
     }
   else Print("Операция FileOpen неудачна, ошибка ",GetLastError());
//---
   Print("Очищаем папку \\MQL5\\",subfolder);
   FolderClean(subfolder,1);

   Print("Удаляем папку \\MQL5\\",subfolder);
   if(!FolderDelete(subfolder,1))
      PrintFormat("Ошибка! Не удалось удалить папку  \\MQL5\\",subfolder);
  }
//+------------------------------------------------------------------+
 
Rashid Umarov:

本当にヘルプを読んで正しくコードを変更することができないのでしょうか?態度の違いを求めるのはどうなんでしょう?以下は、ヘルプにあるコードで、黄色で追加した部分です。

もし、私がコードを間違えたかどうかで、私の人に対する態度が変わるとしたら、ここは何かがおかしいと思うのですが・・・))

まだ、あなたの主張がよく理解できないのですが。

私は改造したコードを何度もフォーラムに投稿しています。私の唯一のミスは、明示的なファイル閉鎖を追加した後、スクリプトを再保存するのを忘れたため、変更したスクリプトの問題が解決されたことに気づかなかったことです。しかし、いずれにせよ、ドキュメントには作成後にファイルをクローズしなければならないとは明示的に書かれていません。

それを過ぎると、前にも言ったように、フォルダ(ファイルではない注)を消してしまうという問題がまだ残っていたのです。フォルダにはもうファイルは入っていませんが、FolderClean機能で 消去されます。

原因はまだはっきりしていません。

だから、結局のところ、私がサービスデスクに行ったのは理由があったのかもしれません。

私の問題に長い時間をかけて検討していただき、ありがとうございました))。

 
Реter Konow:
ありがとうございます。この問題に直面しているのは私だけではないようで嬉しい。この問題を解決する必要があります(これがないと、ファイルナビゲータを使い終えることができません)。servicedeckに手紙を書きました。でも、念のためここにも書いておきます。結果的には無駄にはならなかったが)。
fxsaber

このようなことは何度も経験しています。ある時点で、すべてのサブフォルダーとファイルを含むFilesフォルダーが読み取り専用属性になることがわかりました。手動でこのフラグの選択を解除しても、効果はありません。しかし、ターミナルを再起動することでいつも解決します。再生できなかった(試していない)ので、SDに報告しなかった。

参加すること。以前、2014年初頭から、このフォルダーにファイルを作成しようとすると、16ミリ秒単位で9回連続でOSの「32共有違反」エラーが発生する極めて稀なクラッシュがありました。何が悪いのか、わからなかった。当時、MQで行われていた「ファイル処理機能の抜本的なバージョンアップ」のせいにしていました。どちらも再現できません。ただ、偶然にも20:12:42にこの不具合が発生しました。すぐに、数秒経過して、そのフォルダの中のファイルに行き、なんとか正しく編集して保存しました。失敗が捕まらない。

その前の5年間は月に1、2回のペースでクラッシュが発生していましたが、2014年2月からは毎週でしょう、何回目かは数えていません。同時に稼働する端末は40〜50台から35台に減少しましたが。

 
Vladimir:

同伴する。以前、2014年初頭から、このフォルダーにファイルを作成しようとすると、16ミリ秒単位で9回連続でOSの「32 Sharing violation」エラーが発生するという極めて稀な障害が発生したことがあります。何が悪いのか、わからなかった。当時、MQで行われていた「ファイル処理機能の抜本的なバージョンアップ」のせいにしていました。どちらも再現できません。ただ、偶然にも20:12:42にこの不具合が発生しました。すぐに、数秒経過して、そのフォルダの中のファイルに行き、なんとか正しく編集して保存しました。不具合は捕まらない。

それ以前は5年間、月に1~2回の頻度でこのクラッシュが発生していましたが、2014年2月からは必ず毎週、何回発生したのか数え切れないほどになっています。同時に稼働する端末は40〜50台から35台に減少しましたが。

明示的に閉じなくても、すべてのファイルが消去されているのですが。作成しておらず、以前はFilesフォルダの中にあったため消去。

ファイルを消去するためには、そのハンドルが必要だということです。しかし、ファイルを作成せず、Filesフォルダに置いただけでは、そのハンドルを取得できないため、FileClose()で 閉じることができない。

同時に、コピーしたり消したりすることも可能です。ただし、その後、プログラムまたは手動でフォルダを削除することはできません。端末を再起動した後、手動で行う。

後ほど、図解入りでよりわかりやすく再現してみたいと思います。

 
Реter Konow:

明示的に閉じなくても、すべてのファイルが消去されるんだけど。作成しておらず、以前はFilesフォルダの中にあったため消去。

ポイントは、ファイルを消去するためには、そのハンドルが必要だということです。しかし、このファイルを作成せず、Filesフォルダに入れただけであれば、ハンドルを取得できないので、FileClose()で 閉じることができない。

同時に、コピーしたり消したりすることも可能です。ただし、その後、プログラムまたは手動でフォルダを削除することはできません。端末を再起動した後、手動で行う。

後ほど、わかりやすい例を挙げて、より明確に問題を再現してみたいと思います。

これが問題の核心でしょう。

カスタムファイルナビゲーターでフォルダー名を変更する際、FolderRename()が存在しないため使用できないのですが。

その代わり、すべてのファイルとフォルダをカスタム名の新しいフォルダにコピーし、元のフォルダ(名前を変更した)から元の元のファイルとフォルダを削除しています。その結果、まず元のフォルダーからすべてのファイルを消去し(新しいフォルダーにコピーした後)、次にFolderClean()を使って、すでに空になっている元のフォルダーに残ったフォルダー階層を削除しようとしています。ここでエラーが発生します。一部のフォルダは消去されますが、1~2個は元フォルダと同じように残ります。 その後、手動で消去しようとすると失敗する。端末を再起動するのみで、解決します。

 
Реter Konow:

これが問題の核心でしょう。

カスタムファイルナビゲーターでフォルダー名を変更する際、FolderRename()が存在しないため使用できないのですが。

その代わり、すべてのファイルとフォルダをカスタム名の新しいフォルダにコピーし、元のフォルダ(名前を変更したもの)から元の元のファイルとフォルダを削除しています。その結果、まず元のフォルダー内のファイルをすべて消去し(新しいフォルダーにコピーした後)、次にFolderClean()を使って、すでに空になっている元のフォルダーに残っているフォルダー階層を削除しようとするのですが、これがうまくいきません。ここでエラーが発生します。一部のフォルダは消去されますが、1~2個は元フォルダと同じように残ります。 その後、手動で消去しようとすると失敗する。端末を再起動するのみで、解決します。


フィクションという魅力的なジャンルで書く限り、続けてください。40ページくらいには「技術文献」のジャンルに移行していることを期待します。