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

 
Реter Konow:

というか、スクリプトでEAを作って動かしてみましたか?

FILE_SHARE_READと FILE_SHARE_WRITE フラグを試すと、なぜやり直すのか?
 
A100 そして、あらゆる場所でFILE_COMMONを試してみて ください。

STARIJ なぜやり直すのか? 確認するのが面倒なのですが、FILE_SHARE_READと FILE_SHARE_WRITE フラグを試してみると、次のようになります。

問題は、これらのフラグがFolderClean()とどのような関係があるのかが不明なことです。全然違う、と私は思っています。

ファイルとは全く関係ないことを証明したい。notempty」フォルダの代わりに「DeleteMe.txt」フォルダを作成し、このフォルダを以前のファイルで試みたように消去するようにスクリプトを作り直します。違いが出るかどうか見てみましょう)。

Automated Trading and Strategy Testing
Automated Trading and Strategy Testing
  • www.mql5.com
MQL5: language of trade strategies built-in the MetaTrader 5 Trading Platform, allows writing your own trading robots, technical indicators, scripts and libraries of functions
 
Реter Konow:

問題は、これらのフラグがFolderClean()とどのような関係があるのかが不明なことです。全然違う、と私は思っています。

は、フォルダ内にファイルがない場合、または削除可能な場合は、削除することができます。これらのフラグにより、ファイル

 
Реter Konow:

というか、スクリプトでEAを作って動かしてみましたか?

私がどこでEAを作ったと言いましたか?

 

確かに、明示的にファイルを閉じるとうまくいきますね。私が間違っていたようです。一度目はうまくいきませんでしたが、おそらく再設計したスクリプトの新しいバージョンを保存していなかったため、明示的なクロージャが有効にならなかったのだと思います。

今度は、ファイルではなく、フォルダを作成して みました。問題なく消去されました。

その後、再度ファイル作成を追加しました。結果:明示的にファイルを閉じないと、以前のようにスクリプトによってフォルダが消去されません。明示的にファイルを閉じると、完全に消去されます。

もちろん、この体験ですべてが説明できるわけではなく、今のところもやもやとしたものが残っていますが、この結果は感動的です。

今後もテストを続け、結果を報告する予定です。

まだ問題があるかもしれないし、今はまだ何とも言えない。

 
Alexey Viktorov:

参議院がどうのこうのなんて、どこに書いてあるんだ?

申し訳ありません、誤解していました。
 

以下は、「DeleteMe.txt」と「DeleteMe Folder」の両方のファイルを作成するスクリプトのコードです。 ファイルは作成後すぐに明示的に閉じられます。

すべてがうまくいっているように見えるが...。

//+------------------------------------------------------------------+ 
//|                                            Demo_FolderDelete.mq5 | 
//|                        Copyright 2011, MetaQuotes Software Corp. | 
//|                                              https://www.mql5.com | 
//+------------------------------------------------------------------+ 
#property copyright "Copyright 2011, MetaQuotes Software Corp." 
#property link      "https://www.mql5.com" 
#property version   "1.00" 
//--- описание 
#property description "Скрипт показывает пример использования FolderDelete()." 
#property description "Сначала создаются две папки, одна пустая, другая содержит файл." 
#property description "При попытке удаления непустой папки получим ошибку и предупреждение."
 
//--- покажем окно входных параметров при запуске скрипта 
#property script_show_inputs 
//--- входные параметры 
input string   firstFolder="empty";    // пустая папка 
input string   secondFolder="nonempty";// папка, в которой будет один файл 
string FolderName="delete_me Folder";       // имя файла, который мы создадим в папке secondFolder 
string filename="delete_me.txt";       // имя файла, который мы создадим в папке secondFolder 
//+------------------------------------------------------------------+ 
//| Script program start function                                    | 
//+------------------------------------------------------------------+ 
void OnStart() 
  { 
//--- хендл файла запишем сюда 
   int handle; 
//--- выясним в какой папке мы работаем 
   string working_folder=TerminalInfoString(TERMINAL_DATA_PATH)+"\\MQL4\\Files"; 
//--- отладочное сообщение    
   PrintFormat("working_folder=%s",working_folder); 
//--- попытка создать пустую папку относительно пути MQL4\Files 
   if(FolderCreate(firstFolder,0)) // 0 означает, что работаем в локальной папке терминала 
     { 
      //--- выведем полный путь до созданной папки 
      PrintFormat("Cоздали папку %s",working_folder+"\\"+firstFolder); 
      //--- сбросим код ошибки 
      ResetLastError(); 
     } 
   else 
      PrintFormat("Не удалось создать папку %s. Код ошибки %d",working_folder+"\\"+firstFolder, GetLastError());
 
//--- теперь создадим пустую папку с помощью функции FolderCreate 
   string filepath=secondFolder+"\\"+FolderName;  // сформируем путь для файла, который хотим открыть на запись в несуществующей папке 

   if(FolderCreate(filepath)) 
     { 
      FolderCreate(filepath + "1");
      PrintFormat("Открыли папку %s",working_folder+"\\"+filepath); 
     } 
   else 
      PrintFormat("Не удалось создать папку %s в папке %s. Код ошибки=",FolderName,secondFolder, GetLastError());
 /**/
 //--- теперь создадим файл с помощью функции FileOpen() 
   string filepath_2=secondFolder+"\\"+filename;  // сформируем путь для файла, который хотим открыть на запись в несуществующей папке 
   handle=FileOpen(filepath_2,FILE_WRITE|FILE_TXT); // флаг FILE_WRITE в данном случае обязателен, см. справку к функции FileOpen 
   if(handle!=INVALID_HANDLE) 
     {
//*************************************************************************     
   //---- Явно закрываем файл.   
      FileClose(handle);
//*************************************************************************           
      PrintFormat("Открыли файл на чтение %s",working_folder+"\\"+filepath_2); 
     } 
   else 
      PrintFormat("Не удалось создать файл %s в папке %s. Код ошибки=",filename,secondFolder, GetLastError());
 
 
   Comment(StringFormat("Готовимся удалить папки %s и %s", firstFolder, secondFolder)); 
//--- Небольшая пауза в 5 секунд, чтобы мы могли прочитать сообщение на графике 
   Sleep(5000); // Sleep() нельзя использовать в индикаторах!
 
//--- выведем диалоговое окно и просим пользователя 
   int choice=MessageBox(StringFormat("Удалить папки %s и %s?", firstFolder, secondFolder), 
                         "Удаление папок", 
                         MB_YESNO|MB_ICONQUESTION); //  будут две кнопки - "Yes" и "No"
 
//--- выполним действия в зависимости от выбранного варианта 
   if(choice==IDYES) 
     { 
      //--- очистим комментарий на графике 
      Comment(""); 
      //--- выведем сообщение в журнал "Эксперты" 
      PrintFormat("Пробуем удалить папки %s и %s",firstFolder, secondFolder); 
      ResetLastError(); 
      //--- удаляем пустую папку 
      if(FolderDelete(firstFolder)) 
         //--- должны увидеть это сообщение, так как папка пустая 
         PrintFormat("Папка %s успешно удалена",firstFolder); 
      else 
         PrintFormat("Не удалось удалить папку %s. Код ошибки=%d", firstFolder, GetLastError());
 
      ResetLastError(); 

   //***********************************************************************************************************************   
      //--- сначала очищаем папку
      if(FolderClean(secondFolder))
         PrintFormat("Папка %s успешно очищена", secondFolder);
      else 
         //---  
         PrintFormat("Не удалось очистить папку %s. Код ошибки=%d", secondFolder, GetLastError());
   //***********************************************************************************************************************   
   
      ResetLastError(); 
        
      //--- удаляем папку, которая содержит файл               
      if(FolderDelete(secondFolder)) 
         PrintFormat("Папка %s успешно удалена", secondFolder); 
      else 
         //--- 
         PrintFormat("Не удалось удалить папку %s. Код ошибки=%d", secondFolder, GetLastError()); 
     }  

   else 
      Print("Удаление отменено"); 
//--- 
  }


 
Реter Konow:

もちろん、この体験ですべてが説明できるわけではなく、今のところ漠然としたものが残っていますが、この結果は感動的です。

今後もテストを続け、結果を報告する予定です。

まだ問題があるかもしれませんし、今のところ何とも言えません。

はい、もちろんできますし、詳細は伏せておいて、「ヘルプの例を変えただけで、まったく何もしていません」と言えばいいのです。

ログを使えば誰でも推測できますし、その方がずっと面白いですから。

 
Rashid Umarov:

もちろん、書いてください。 そして、詳細は自分自身の中に留めておいて、ただ「私はヘルプの例を少し変更しました、全く何もありません」と言うだけです。

ログがあれば誰でも推測できますし、そのほうがずっと面白いですから。

変なのです。個人的なことではないんです。もし、プロらしくない態度をとっていたら、ごめんなさい。勉強になります。

ご協力ありがとうございました。


P.S. 私は今までフォーラムで助けを求めたことがなかっただけです。それゆえ、未熟なのです。

 

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

証拠も詳細もない。サービスデスクに書き込む必要はない。