파일 작업. - 페이지 5

 
Yedelkin :

질문 1: 문서에 오타가 있고 "마지막 읽기 날짜" 대신 "마지막 개봉 날짜"와 같은 것이 있어야 한다고 생각하십니까?

예, 그대로:

lpLastAccessTime [출력, 선택 사항]

파일 또는 디렉터리에 마지막으로 액세스한 날짜와 시간을 수신하는 FILETIME 구조에 대한 포인터입니다. 마지막 액세스 시간에는 파일 또는 디렉토리가 마지막으로 쓰여지고 읽거나 실행 파일의 경우 실행된 시간이 포함됩니다.

무료 번역 -- 마지막 액세스에는 파일을 마지막으로 읽거나 쓰거나 실행한 시간이 포함됩니다(실행 가능한 경우).

핸들을 다시 닫는 것에 대해 내가 틀릴 수도 있지만 다음과 같은 흥미로운 텍스트도 있습니다.

모든 파일 시스템이 생성 및 마지막 액세스 시간을 기록할 수 있는 것은 아니며 모든 파일 시스템이 동일한 방식으로 기록하는 것도 아닙니다. 예를 들어 FAT에서 생성 시간은 10밀리초의 해상도를 가지며 쓰기 시간은 2초의 해상도를 가지며 액세스 시간은 1일(실제로는 액세스 날짜)의 해상도를 갖습니다. 따라서 GetFileTime 함수는 SetFileTime 함수를 사용하여 설정된 동일한 파일 시간 정보를 반환하지 않을 수 있습니다.

NTFS는 파일에 대한 마지막 액세스 시간에 대한 업데이트를 마지막 액세스 후 최대 1시간까지 지연시킵니다. NTFS는 또한 마지막 액세스 시간 업데이트가 비활성화되도록 허용합니다. 마지막 액세스 시간은 기본적으로 NTFS 볼륨에서 업데이트되지 않습니다.

현재 상황에서 핸들을 "다시 열지" 않고 파일 속성을 얻을 때 행복이 기대됩니다.

분명히 적어도 몇 초 동안은 행복이 없을 것입니다.
 
TheXpert :

예, 그대로:

무료 번역 -- 마지막 액세스에는 파일을 마지막으로 읽거나 쓰거나 실행한 시간이 포함됩니다(실행 가능한 경우).

핸들을 다시 닫는 것에 대해 내가 틀릴 수도 있지만 다음과 같은 흥미로운 텍스트도 있습니다.

분명히 행복은 없을 것입니다. 적어도 몇 초 만에 말이다.

시야를 넓혀주셔서 감사합니다! M-dy... 부머님.

이 스크립트는 "마지막 읽기 날짜" 대신 FILE_ACCESS_DATE 식별자가 일반적으로 이전 파일 닫기 시간을 반환한다고 말합니다.

 int handle_file;
void OnStart ()
  {
   Print ( "===============================================" );
   handle_file= FileOpen ( "Ye_file2.bin" , FILE_READ | FILE_WRITE | FILE_BIN );
   switch (handle_file)
     {
       case    INVALID_HANDLE : break ;
       default :
         Print ( "Дата создания файла Ye_file2.bin: " ,( datetime ) FileGetInteger (handle_file, FILE_CREATE_DATE ));
         for ( int i= 0 ;i< 3 ;i++)
           {
             Sleep ( 2000 );
             FileReadInteger (handle_file,CHAR_VALUE);
             Print ( "Дата последнего чтения Ye_file2.bin: " ,( datetime ) FileGetInteger (handle_file, FILE_ACCESS_DATE ));
           }
         Sleep ( 3000 );
         Print ( "Время обращения к FileClose(handle_file): " , TimeTradeServer ());
         FileClose (handle_file);
     }
  }
 
TheXpert :

그러나 거친 결론에도 불구하고 테스트는 여전히 지시적이므로 변경 사항이없는 경우 함수의 작업에 대한 개발자의 의견을 기다리고 있습니다.

그건 그렇고, 나는 지난 3 개월 동안 어떤 코멘트도받지 못했기 때문에 지금은 FileFlush() 함수를 사용하지 않습니다.
 

FileFlush가 FileClose 대신 사용되는 경우 프로그램 속도를 늦추거나 높여서는 안 된다고 생각합니다.

모든 쓰기에서 루프에서 사용하는 것은 의미가 없습니다. 문서가 변경될 때마다(특히 이 문서에 많은 텍스트와 그림이 있는 경우) Word의 작업이 어떻게 느려질지 상상해 보십시오. FileFLush를 사용하면 파일을 닫지 않고도 쉽게 저장할 수 있습니다.

아마도 개발자들은 다음을 의미했을 것입니다(예를 들어):

OnInit - 파일열기

온 틱 - FileWrite FileFlush

(여기서 데이터는 -FileFlash - 루프에서, 루프의 모든 패스가 아니라 루프가 끝난 후에 저장됩니다.)

OnDeinitFileClose.

FileFlash의 본질은 항상 파일 핸들과 신비한 파일 버퍼를 다시 초기화하지 않도록 조언자의 작업 시간을 기록하는 것입니다.

......아마도)

 
Yedelkin :
그건 그렇고, 나는 지난 3개월 동안 어떤 코멘트도 받지 않았기 때문에 지금은 FileFlush() 함수를 사용하지 않고 있습니다.
그것은 여전히 즉시 저장을 보장하지 않습니다. 따라서 핸들을 닫지 않고 현재 상태를 저장하는 데만 사용하는 것이 좋습니다.
 
예델킨 :
그건 그렇고, 나는 지난 3개월 동안 어떤 코멘트도 받지 않았기 때문에 지금은 FileFlush() 함수를 사용하지 않고 있습니다.

FileFlush() 함수 를 사용하는 의미를 더 잘 이해하기 위해서는 파일 입출력 버퍼의 개념에 대해 생각해볼 필요가 있습니다... 아시다시피 디스크의 정보는 바이트 단위로 저장되고 각 바이트를 따로따로 기록합니다. 들어와) 낭비의 높이입니다! "하드웨어" 측면에서 이 프로세스를 보면 운영 체제는 바이트 쓰기 작업에 대한 각 요청과 함께 하드 디스크 드라이브의 "기록 헤드를 감아야" 합니다! 그러나 하드 드라이브는 운동학입니다! 즉, 컴퓨터 장치 중 가장 느립니다. 그렇다면 탈출구는 무엇입니까? 그리고 매우 간단합니다! FileWrite 함수 및 이와 유사한 함수에서 데이터를 보내는 컴퓨터 메모리(보통 수십 킬로바이트)에 데이터 버퍼가 생성되며, 이 버퍼가 완전히 차면 시스템은 이를 완전히 하드 디스크에 씁니다. 연속적인 데이터 블록의 형태로 드라이브 헤드의 불필요한 조작이 없이, 다만 데이터가 한 번에 기록된다! 이제 한 번에 32킬로바이트의 정보를 쓰는 속도가 동일한 볼륨의 각 바이트를 별도로 쓰는 것보다 몇 배나 증가하는지 계산하십시오. 그런 다음 녹음이 이루어집니다. 그리고 그것은 읽기/쓰기 시 하드 드라이브의 모든 "무거운" 작업에 들어가지 않습니다. :) 버퍼의 경우 헤드를 한 번 배치하고 전체 블록을 하나의 스트림에 씁니다!

그러나 이 모든 것은 버퍼가 가득 찰 때까지 데이터가 물리적으로 파일에 나타나지 않거나(!!!) 파일 자체를 닫을 때까지 이 경우 버퍼(또는 그 안에 남아 있는 것)가 즉시 디스크에 기록됩니다. 이것이 FileFlush 기능이 구출되는 곳입니다. 일부 정보를 파일에 "기록"하고 파일에서 물리적 모양을 보장해야 하는 경우(예: 이 정보는 다른 프로그램, 표시기, 조언자에 의해 이미 필요할 수 있음), FileFlush 함수를 호출할 수 있습니다. 나사의 버퍼 내용을 물리적으로 플러시합니다(파일로)!

결론: FileFlush 함수를 자주 사용하거나 파일 작업 속도를 높이기 위해 주기를 사용하면 반대 결과가 나타납니다. 호출할 때마다 시스템에서 I/O 버퍼에 실제로 포함된 정보의 양을 계산해야 하기 때문입니다. , 운영 체제를 호출하고 주어진 메모리 영역을 파일에 쓰라는 명령을 내리십시오! 예를 들어 루프에서 1바이트가 파일에 기록되고 FileFlush 함수가 즉시 호출됩니다. 디스크에 쓰는 가장 느린 방법은 BYBYTE!!! ;)

그렇다면 파일에 쓰는 가장 빠른 방법은 무엇입니까? 예, 매우 간단합니다. 이 버퍼의 오버플로 및 필요한 경우 스트리밍 데이터를 생성하고(하드 드라이브와 같은 서투른 장치에서 가능한 가장 빠른 작업!) 새 데이터를 수신하기 위해 버퍼를 비웁니다!!!

그런 다음 "FileFlush 기능이 필요한 이유는 무엇입니까 ???"라는 질문이 발생합니다. 그리고 대답은 간단합니다. 버퍼 채우기에 관계없이 데이터를 파일에 물리적으로 기록해야 할 때 필요합니다. 그러한 필요성의 예가 위에 주어졌습니다.

Документация по MQL5: Файловые операции / FileFlush
Документация по MQL5: Файловые операции / FileFlush
  • www.mql5.com
Файловые операции / FileFlush - Документация по MQL5
 

MQL5에 대한 지표를 다시 작성해야 했고 심각한 오해에 봉착했습니다.

코드는 다음과 같습니다.

  first_bar= ChartGetInteger ( 0 , CHART_FIRST_VISIBLE_BAR , 0 );
  
   //--- установим доступ к массиву как к таймсерии
   ResetLastError ();
   int copied= CopyTime ( NULL , 0 , 0 ,first_bar,TimeAsSeries);
  del();
   int handle= FileOpen ( "Price Label\\" + _Symbol +tpl_ext, FILE_READ | FILE_CSV , ';' ,CP_ACP);
   int er= GetLastError ();
   ResetLastError ();
  
   string sTF= "" ;
   int TF;
   string period_name;
   string price_label;
   string price1;
   string price2;
  
   if (handle>= 1 ){
     while ( FileIsEnding (handle)== false ){
      sTF = FileReadString (handle);
      TF = ResolveTF(sTF);
      period_name= FileReadString (handle);
      price_label= FileReadString (handle);
      price1= FileReadString (handle);
      price2= FileReadString (handle);
      drawe_price(TF,handle,period_name,price_label,price1,price2);
    }
     FileClose (handle);
  }
   return ( 0 );

디버거에서 어떤 일이 일어나는지 보기 위해 이러한 많은 변수가 도입되었음을 즉시 설명하겠습니다. 그리고 보았다...

파일에는 여러 줄이 포함되어 있으며 각 줄에는 ";"으로 구분된 5개의 섹션이 있습니다. 첫 번째 전화

sTF = FileReadString (handle);

전체 파일을 sTF 변수로, 이해할 수 없는 인코딩으로 구동합니다. 내가 디버거에서 본 것으로 판단하면(sTF 변수에는 일부 중국 상형 문자가 있습니다) 그는 파일의 내용을 유니코드로 읽습니다! 파일을 열 때 유효한 모든 코드 페이지를 시도했지만 결과는 동일합니다 :( 파일 자체는 Windows 인코딩으로 작성되었습니다.

개가 어디에서 뒤적거렸는지 아는 사람 있나요?

Документация по MQL5: Файловые операции / FileOpen
Документация по MQL5: Файловые операции / FileOpen
  • www.mql5.com
Файловые операции / FileOpen - Документация по MQL5
 

is_vale

정보를 공유해주신 모든 분들께 감사드립니다! 나는 다시 주제로 뛰어들 것이다.

 
FILE_ANSI
 
is_vale :

개가 어디에서 뒤적거렸는지 아는 사람 있나요?

오랫동안 파일 작업을 하지 않았는데, FileOpen() 을 사용할 때 CSV 파일을 선언했습니다. 이전에는 작성된 모든 요소가 유니코드 또는 si 문자열로 변환된다고 명시되어 있습니다. 여기에 개가 있는 건 아닐까?