나에게 모든 파일은 명시적으로 닫지 않아도 지워집니다. 내가 만들지 않았기 때문에 지워지고 그 이전에는 Files 폴더 안에 있었습니다.
사실 파일을 지우려면 핸들이 필요합니다. 그러나 이 파일을 생성하지 않고 Files 폴더에만 배치한 경우 핸들을 가져올 수 없으므로 FileClose() 함수로 파일을 닫을 수 없습니다.
동시에 우리는 여전히 그것을 복사하거나 지울 수 있습니다. 그러나 그 이후의 폴더는 프로그래밍 방식이나 수동으로 삭제할 수 없습니다. 터미널을 다시 시작한 후에만 수동으로.
나중에 나는 예시적인 예를 통해 문제를 더 명확하게 재현하려고 노력할 것입니다.
코드는 완전해야 합니다. 파일이 열려 있으면 컴퓨터를 끄거나 MT4\5를 닫기 전에 파일을 닫아야 합니다. 그리고 핸들은 바람직하며 프로그램의 어느 곳에서나 사용할 수 있어야 합니다. IMHO입니다. 더 나은 방법은 읽기/쓰기 작업이 수행된 직후 또는 아무 작업도 수행할 필요가 없는 경우에도 파일을 닫는 것입니다.
문서화 예제에서 분명히 그들은 그것을 하지 않는 방법을 보여주었습니다.
파일에 쓸 때 함수를 사용하여 I/O 파일 버퍼에 남아 있는 모든 데이터를 디스크 에 덤프해야만 쓰여진 것을 읽을 수 있음을 기억하는 것도 매우 중요합니다. FileFlush 또는 파일을 닫습니다. 종료하는 동안 데이터는 디스크에 강제로 플러시됩니다.
코드는 완전해야 합니다. 파일이 열려 있으면 컴퓨터를 끄거나 MT4\5를 닫기 전에 파일을 닫아야 합니다. 그리고 핸들은 바람직하며 프로그램의 어느 곳에서나 사용할 수 있어야 합니다. IMHO입니다. 더 나은 방법은 읽기/쓰기 작업이 수행된 직후 또는 아무 작업도 수행할 필요가 없는 경우에도 파일을 닫는 것입니다.
문서화 예에서 분명히 그들은 그것을 하지 않는 방법을 보여주었습니다.
파일에 쓸 때 함수를 사용하여 I/O 파일 버퍼에 남아 있는 모든 데이터를 디스크 에 덤프해야만 쓰여진 것을 읽을 수 있음을 기억하는 것도 매우 중요합니다. FileFlush 또는 파일을 닫습니다. 종료하는 동안 데이터는 디스크에 강제로 플러시됩니다.
요약: 파일을 열면 닫는 것을 잊지 마십시오. 그리고 파일 핸들은 손실되지 않습니다.
다시 한 번: FileClose() 함수를 사용하여 내 프로그램에서 만든 파일을 닫을 수 있습니다. 핸들이 있습니다.
이전에 누군가에 의해 생성되었지만 Files 폴더에 있는 파일은 핸들이 없기 때문에 FileClose() 함수로 닫을 수 없습니다.
내가 만든 파일이 아닌(내 프로그램이 아닌) 파일을 복사하면 FileClose() 함수(핸들 없음)로 복사한 후 파일을 닫을 수 없지만 지울 수는 있습니다.
그렇기 때문에 파일을 복사한 후 삭제한 폴더는 FolderClean () 함수로 삭제되지 않습니다. 복사 후 닫히지 않았기 때문일 수 있습니다.
1. 스크립트가 로드되기 전에 Files 폴더에 생성된 파일 핸들을 가져오는 방법은 무엇입니까?
2. FolderClean() 함수를 사용하여 폴더를 삭제하는 문제는 이전에 다른 폴더에 복사하고 복사 후 닫히지 않은 파일을 삭제한 후(핸들이 없기 때문에) 위에 설명된 이유가 있습니까?
이것은 말하자면 OS의 기본입니다. 응용 프로그램이 쓰기 위해 파일을 연 경우 이 파일이나 이 파일이 포함된 폴더를 삭제할 수 없습니다. Word에서 파일을 연 다음 OS를 사용하여 파일이 있는 폴더를 삭제해 보십시오. 무슨 일이 일어날 것? 액세스 권한이 없기 때문에 작동하지 않습니다.
글쎄, 당신은 파일 핸들을 얻을 수 있습니다. 그러나 이 행동이 무슨 소용이 있겠습니까? 결국 파일이 다른 응용 프로그램에서 열리면 이전 문을 참조하십시오. 그리고 우리는 우리의 애플리케이션에서 유효한 핸들만을 얻을 것입니다.
이것은 말하자면 OS의 기본입니다. 응용 프로그램이 쓰기 위해 파일을 연 경우 이 파일이나 이 파일이 포함된 폴더를 삭제할 수 없습니다. Word에서 파일을 연 다음 OS를 사용하여 파일이 있는 폴더를 삭제해 보십시오. 무슨 일이 일어날 것? 액세스 권한이 없기 때문에 작동하지 않습니다.
글쎄, 당신은 파일 핸들을 얻을 수 있습니다. 그러나 이 행동이 무슨 소용이 있겠습니까? 결국 파일이 다른 응용 프로그램에서 열리면 이전 문을 참조하십시오. 그리고 우리는 우리의 애플리케이션에서 유효한 핸들만을 얻을 것입니다.
테스트 시 미리 [data 폴더]\MQL5\Files 폴더에 "test" 폴더를 생성했고, 그 안에 다음과 같은 내용의 텍스트 파일 "source.txt"를 생성했습니다.
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
);
따라서 1단계: MQL5를 사용하여 "source.txt" 파일을 다른 파일에 복사
스크립트:
//--- 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입니다. 더 나은 방법은 읽기/쓰기 작업이 수행된 직후 또는 아무 작업도 수행할 필요가 없는 경우에도 파일을 닫는 것입니다.
문서화 예제에서 분명히 그들은 그것을 하지 않는 방법을 보여주었습니다.
파일에 쓸 때 함수를 사용하여 I/O 파일 버퍼에 남아 있는 모든 데이터를 디스크 에 덤프해야만 쓰여진 것을 읽을 수 있음을 기억하는 것도 매우 중요합니다. FileFlush 또는 파일을 닫습니다. 종료하는 동안 데이터는 디스크에 강제로 플러시됩니다.
요약: 파일을 열면 닫는 것을 잊지 마십시오. 그리고 파일 핸들은 손실되지 않습니다.
코드는 완전해야 합니다. 파일이 열려 있으면 컴퓨터를 끄거나 MT4\5를 닫기 전에 파일을 닫아야 합니다. 그리고 핸들은 바람직하며 프로그램의 어느 곳에서나 사용할 수 있어야 합니다. IMHO입니다. 더 나은 방법은 읽기/쓰기 작업이 수행된 직후 또는 아무 작업도 수행할 필요가 없는 경우에도 파일을 닫는 것입니다.
문서화 예에서 분명히 그들은 그것을 하지 않는 방법을 보여주었습니다.
파일에 쓸 때 함수를 사용하여 I/O 파일 버퍼에 남아 있는 모든 데이터를 디스크 에 덤프해야만 쓰여진 것을 읽을 수 있음을 기억하는 것도 매우 중요합니다. FileFlush 또는 파일을 닫습니다. 종료하는 동안 데이터는 디스크에 강제로 플러시됩니다.
요약: 파일을 열면 닫는 것을 잊지 마십시오. 그리고 파일 핸들은 손실되지 않습니다.
다시 한 번: FileClose() 함수를 사용하여 내 프로그램에서 만든 파일을 닫을 수 있습니다. 핸들이 있습니다.
이전에 누군가에 의해 생성되었지만 Files 폴더에 있는 파일은 핸들이 없기 때문에 FileClose() 함수로 닫을 수 없습니다.
내가 만든 파일이 아닌(내 프로그램이 아닌) 파일을 복사하면 FileClose() 함수(핸들 없음)로 복사한 후 파일을 닫을 수 없지만 지울 수는 있습니다.
그렇기 때문에 파일을 복사한 후 삭제한 폴더는 FolderClean () 함수로 삭제되지 않습니다. 복사 후 닫히지 않았기 때문일 수 있습니다.
그러나 손잡이가 없기 때문에 닫을 수 없습니다!
:)))
개발자를 위한 질문:
1. 스크립트가 로드되기 전에 Files 폴더에 생성된 파일 핸들을 가져오는 방법은 무엇입니까?
2. FolderClean() 함수를 사용하여 폴더를 삭제하는 문제는 이전에 다른 폴더에 복사하고 복사 후 닫히지 않은 파일을 삭제한 후(핸들이 없기 때문에) 위에서 설명한 이유가 있습니까?
개발자를 위한 질문:
1. 스크립트가 로드되기 전에 Files 폴더에 생성된 파일 핸들을 가져오는 방법은 무엇입니까?
2. FolderClean() 함수를 사용하여 폴더를 삭제하는 문제는 이전에 다른 폴더에 복사하고 복사 후 닫히지 않은 파일을 삭제한 후(핸들이 없기 때문에) 위에 설명된 이유가 있습니까?
이것은 말하자면 OS의 기본입니다. 응용 프로그램이 쓰기 위해 파일을 연 경우 이 파일이나 이 파일이 포함된 폴더를 삭제할 수 없습니다. Word에서 파일을 연 다음 OS를 사용하여 파일이 있는 폴더를 삭제해 보십시오. 무슨 일이 일어날 것? 액세스 권한이 없기 때문에 작동하지 않습니다.
글쎄, 당신은 파일 핸들을 얻을 수 있습니다. 그러나 이 행동이 무슨 소용이 있겠습니까? 결국 파일이 다른 응용 프로그램에서 열리면 이전 문을 참조하십시오. 그리고 우리는 우리의 애플리케이션에서 유효한 핸들만을 얻을 것입니다.
이것은 말하자면 OS의 기본입니다. 응용 프로그램이 쓰기 위해 파일을 연 경우 이 파일이나 이 파일이 포함된 폴더를 삭제할 수 없습니다. Word에서 파일을 연 다음 OS를 사용하여 파일이 있는 폴더를 삭제해 보십시오. 무슨 일이 일어날 것? 액세스 권한이 없기 때문에 작동하지 않습니다.
글쎄, 당신은 파일 핸들을 얻을 수 있습니다. 그러나 이 행동이 무슨 소용이 있겠습니까? 결국 파일이 다른 응용 프로그램에서 열리면 이전 문을 참조하십시오. 그리고 우리는 우리의 애플리케이션에서 유효한 핸들만을 얻을 것입니다.
내 응용 프로그램(파일 탐색기)에서 파일을 열어 다른 폴더에 덮어씁니다.
덮어쓴 후 파일을 닫아야 하지만 처리할 수 없고 파일을 지울 수 없습니다.
파일이 언제 생성되었는지, 누구에 의해 생성되었는지 아무도 모르기 때문에 핸들이 없습니다.
이 경우 파일은 Files 폴더 안에 존재하며 다른 폴더에 복사 후 삭제할 수 있습니다.
그러나 복사 후에는 이 파일을 닫을 수 없습니다. 핸들이 없습니다.
이것이 아마도 삭제된 파일이 있는 FolderClean() 폴더의 추가 지우기가 작동하지 않는 이유일 것입니다.
질문: MQL 프로그램에서 이 파일의 핸들을 얻는 방법은 무엇입니까?
커뮤니티에서는 아직 그런 문제가 발생하지 않은 것 같습니다... :)
알겠습니다. 생각해 보겠습니다.
언제나처럼.))
우리는 신화를 폭로합니다.
따라서 운영 체제에 대한 터미널 데이터:
테스트 시 미리 [data 폴더]\MQL5\Files 폴더에 "test" 폴더를 생성했고, 그 안에 다음과 같은 내용의 텍스트 파일 "source.txt"를 생성했습니다.
따라서 1단계: MQL5를 사용하여 "source.txt" 파일을 다른 파일에 복사
스크립트:
2단계: MQL5를 사용하여 "테스트" 폴더 정리
스크립트:
3단계: MQL5를 사용하여 "test" 폴더 삭제
어려움은 무엇입니까? 모든 것이 작동합니다.
어려움은 무엇입니까? 모든 것이 작동합니다.
이 예를 들어 주셔서 감사합니다. 내일 아침에 해결하겠습니다. 지금은 힘이 없다.)
제가 다 테스트해보고 답변드리겠습니다.
추가됨:
여기에서 세 가지 다른 스크립트를 가져왔습니다.
나는 하나의 프로그램을 가지고 있고 파일과 폴더를 복사하고 지우는 것은 두주기의 한 기능 내에서 발생합니다.
첫 번째 주기를 입력합니다. 먼저 소스 파일을 다른 폴더에 복사 한 다음 이 소스 파일을 삭제합니다. 우리는 첫 번째 사이클을 종료합니다.
두 번째 루프 진입: FolderClean()으로 소스 폴더를 정리하고 -FolderDelete()로 소스 폴더를 삭제합니다.
다음으로, 메타에디터의 파일 탐색기에서 원본 폴더가 부분적으로 지워진 것을 확인합니다. 파일이 없는 하위 폴더는 완전히 지워지고 남아 있던 하위 폴더는 지워지지 않고 비어 있습니다.
수동으로 폴더를 삭제하려고 합니다.
그런 다음 터미널을 닫고 다시 시작하십시오. 일부 하위 폴더는 저절로 사라지고 나머지는 남아 있습니다. 우리는 문제없이 손으로 그들을 씻습니다. 이 시간.