FileCopy
The function copies the original file from a local or shared folder to another file.
boolFileCopy(
conststring src_file_name, // Name of a source file int common_flag, // Location conststring dst_file_name, // Name of the destination file int mode_flags // Access mode
);
//--- display the window of input parameters when launching the script #property script_show_inputs//--- input parameters inputstring InpSrc="test\\source.txt"; // source inputstring InpDst="test\\destination.txt"; // copy inputint InpEncodingType=FILE_ANSI; // ANSI=32 or UNICODE=64 //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ voidOnStart()
{
//--- display the source contents (it must exist) if(!FileDisplay(InpSrc))
return;
//--- check if the copy file already exists (may not be created) if(!FileDisplay(InpDst))
{
//--- the copy file does not exist, copying without FILE_REWRITE flag (correct copying) if(FileCopy(InpSrc,0,InpDst,0))
Print("File is copied!");
elsePrint("File is not copied!");
}
else
{
//--- the copy file already exists, try to copy without FILE_REWRITE flag (incorrect copying) if(FileCopy(InpSrc,0,InpDst,0))
Print("File is copied!");
elsePrint("File is not copied!");
//--- InpDst file's contents remains the same
FileDisplay(InpDst);
//--- copy once more with FILE_REWRITE flag (correct copying if the file exists) if(FileCopy(InpSrc,0,InpDst,FILE_REWRITE))
Print("File is copied!");
elsePrint("File is not copied!");
}
//--- receive InpSrc file copy
FileDisplay(InpDst);
}
//+------------------------------------------------------------------+ //| Read the file contents | //+------------------------------------------------------------------+ bool FileDisplay(conststring file_name)
{
//--- reset the error value ResetLastError();
//--- open the file int file_handle=FileOpen(file_name,FILE_READ|FILE_WRITE|FILE_TXT|InpEncodingType);
if(file_handle!=INVALID_HANDLE)
{
//--- display the file contents in the loop Print("+---------------------+");
PrintFormat("File name = %s",file_name);
while(!FileIsEnding(file_handle))
Print(FileReadString(file_handle));
Print("+---------------------+");
//--- close the file FileClose(file_handle);
return(true);
}
//--- failed to open the file PrintFormat("%s is not opened, error = %d",file_name,GetLastError());
return(false);
}
//+------------------------------------------------------------------+
フィクションという魅力的なジャンルで書く限り、続けてください。40ページくらいには、技術文献に移っていることを期待します。
明示的に閉じなくても、すべてのファイルが消去されているのですが。作成しておらず、以前はFilesフォルダの中にあったため消去。
ポイントは、ファイルを消去するためには、そのハンドルが必要だということです。しかし、このファイルを作成せず、Filesフォルダに入れただけであれば、ハンドルを取得できないので、FileClose()で 閉じることができない。
同時に、コピーしたり消したりすることも可能です。ただし、その後、プログラムまたは手動でフォルダを削除することはできません。端末を再起動した後、手動で行う。
後ほど、図解入りでよりわかりやすく再現してみたいと思います。
コードが完成していればいいのです。ファイルを開いている場合は、コンピュータのシャットダウンまたはMT4/5を終了する前にファイルを閉じる必要があります。そして、できれば、プログラムのどの場所からもハンドルにアクセスできることが必要です。これはIMHOの話です。さらに良い方法は、そのファイルに対して読み書きの操作を行った後、またはそのファイルに対して何もする必要がない場合でも、すぐにファイルを閉じることです。
サンプルのドキュメントでは、どのようにやってはいけないかが示されているようです。
また、ファイルに書き込んだ場合、書き込んだファイルは、 FileFlushを使用してファイルI/Oバッファに残っているすべてのデータをディスクに フラッシュするか、ファイルを 閉じることによってのみ読み出すことができることを覚えておくことは非常に重要です。ファイルを閉じると、ディスクのデータは強制的にリセットされます。
まとめ:ファイルを開いたら、閉じることを忘れずに。また、ファイルハンドルが失われることはありません。
単純にコードが完成していればいいのです。ファイルを開いている場合は、コンピュータをシャットダウンする前、またはMT4/5を終了する前にファイルを閉じる必要があります。そして、ハンドルは、できればプログラムのどの場所からもアクセスできることが望ましい。これは私の意見です。さらに良いのは、そのファイルに対する読み書きの操作の後、あるいはそのファイルに対して何もする必要がなかったとしても、すぐにそのファイルを閉じてしまうことです。
サンプルのドキュメントでは、どのようにやってはいけないかが示されているようです。
また、ファイルに書き込んだ場合、書き込んだファイルは、 FileFlushを使用してファイルI/Oバッファに残っているすべてのデータをディスクに フラッシュするか、ファイルを 閉じることによってのみ読み出すことができることを覚えておくことは非常に重要である。ファイルを閉じると、ディスクのデータは強制的にリセットされます。
まとめ:ファイルを開いたら、閉じることを忘れずに。また、ファイルハンドルが失われることはありません。
もう一度言いますが、私のプログラムが作成したファイルは、FileClose()関数を使って閉じることができます - 私はそのハンドルを持っています。
他の人が作成した、Filesフォルダーに存在するファイルを閉じることができません。
自分が作ったのではない(自分のプログラムではない) ファイルをコピーした場合、コピー後にFileClose()関数で閉じることができません(ハンドルがない)、しかし、消去することはできます。
そのためか、コピーされたファイルや削除されたファイルがあるフォルダは、FolderClean()関数で削除されません。おそらく、コピーした後に閉じていなかったからでしょう。
しかし、取っ手がないので閉められません。
:)))
開発者に向けての質問です。
1. スクリプトを読み込む前に、Files フォルダに作成されたファイルのハンドルを取得するにはどうすればよいですか。
2.FolderClean() を使って、以前別のフォルダにコピーされ、コピー後に閉じられなかった(ハンドルがないため)フォルダ内のファイルを消した後に削除する問題は、上記のような原因が考えられますか?
開発者に向けての質問です。
1. スクリプトを読み込む前に、Files フォルダに作成されたファイルのハンドルを取得するにはどうすればよいですか。
2.FolderClean()関数で フォルダを削除する際、以前別のフォルダにコピーされ、コピー後に閉じられなかった(ハンドルがないため)フォルダ内のファイルを消去した後に削除する問題は、上記の理由が考えられますでしょうか。
これはOSの基本中の基本のようなものです。アプリケーションが書き込み用にファイルを開いている場合、そのファイルおよびそのファイルを含むフォルダーを削除することはできません。Wordでファイルを開き、OSのツールでそのファイルがあるフォルダーを削除してみてください。どうなるんだろう?できないでしょう、アクセスできないんだから。
しかし、ファイルハンドルを取得することができます。しかし、そのような行為に何の意味があるのでしょうか?結局、そのファイルを他のアプリケーションで開くと、前の文が表示されることになります。私たちのアプリケーションで有効なハンドルだけを取得します。
これはOSの基本中の基本のようなものです。アプリケーションが書き込み用にファイルを開いている場合、そのファイルおよびそのファイルを含むフォルダーは削除できません。Wordでファイルを開き、OSでそのファイルがあるフォルダーを削除してみてください。どうなるんだろう?できないでしょう、アクセスできないんだから。
まあ、ファイルハンドルを取得すればいいんですけどね。しかし、そのような行為に何の意味があるのでしょうか?結局、そのファイルを他のアプリケーションで開くと、前の文が表示されることになります。そ して、私たちの特定のアプリケーションで有効なハンドルだけを取得することができます。
そのファイルを私のアプリケーション(ファイルナビゲータ)で開き、別のフォルダに上書きします。
上書きした後、ファイルを閉じる 必要があるのですが、それができない(ハンドルがない)ので、ファイルを消去しています。
いつ、誰が作ったかわからないファイルなので、ハンドルがないのです。
同時に、Filesフォルダー内にファイルが存在し、他のフォルダーにコピーして消去することも可能です。
しかし、コピーした後、ファイルを閉じることができない。ハンドルがない。
このためか、消去したファイルを含むフォルダのFolderClean()をさらに実行しても、うまくいきません。
質問:このファイルのハンドルをMQLプログラムに取り込むにはどうしたらいいのでしょうか?
これは、まだコミュニティで直面していない問題のようです...。:)
よし、何か考えよう。
いつもそうなんです(笑)
神話を否定する。
そこで、OS上の端末データ。
テスト時には、[data folder]の中に "test "フォルダが作成され、その中に以下の内容のテキストファイル "source.txt "が作成されています。
そこで、ステップ1:MQL5ツールを使って「source.txt」ファイルを別のファイルにコピーする。
スクリプト
ステップ2:MQL5ツールによる "test "フォルダのクリーニング
スクリプト
ステップ3:MQL5ツールによる「test」フォルダの削除
何が問題なのか?すべてがうまくいく。
何が大変なんだ?すべてがうまくいく。
その例には感謝します。明日の朝、考えてみるよ。今はその気力がない)
全部テストして答えを出します。
追加されました。
あなたはここで3つの異なるスクリプトを引用しています。
私は1つのプログラムを持っていて、ファイルやフォルダのコピー、消去が1つの機能内で2サイクルで行われます。
最初のサイクルに入る:まずソースファイルを 別のフォルダーにコピー し、次にそのソースファイルを消去する。第1サイクルを終了する。
FolderClean()でソース・フォルダをクリアし、-FolderDelete()でソース・フォルダを消去しています。
そして、メタエディタのファイルナビゲータを見ると、ソースフォルダが一部消されていることがわかります。ファイルがないサブフォルダは完全に消去され、何らかのファイルがあったサブフォルダは消去されずに空になっています。
手動でフォルダを削除しようとする - 私たちはそれを持っています。
そして、端末を一度終了し、再度起動する。あるサブフォルダーは勝手に消え、あるサブフォルダーは残っていることがわかります。問題なく手動で消去しています。今回は