Não apagar uma pasta se ela contiver arquivos não fechados - página 5

 
Rashid Umarov:

Lembro-me de seu "eu tenho todos os movimentos escritos" no tópico de programação OOP vs procedimento. Neste tópico eu estava apenas convencido de que você não pode ser confiável.

Não há evidência e nenhum detalhe - não há necessidade de escrever para o servicedesk.


Meu problema com a eliminação de pastas ainda não foi resolvido. O roteiro funciona, mas eu ainda não encontrei a causa do meu problema.


Há todos os tipos de possibilidades. A culpa pode ou não ser minha. Estou sempre pronto para fornecer as informações necessárias para resolver o problema.


Meu feedback ao Servicedek não é, de forma alguma, uma reclamação.

 
Rashid Umarov:

Lembro-me de seu "Eu tenho todos os movimentos escritos" no tópico de programação OOP vs procedimento. Neste tópico eu estava convencido de que você não pode ser confiável.

Não sei de que movimentos você está falando e por que você acha que eu não posso ser confiável. Posso ter dado uma razão para isso, mas não me lembro exatamente onde ou quando.

Em qualquer caso, obrigado por sua franca declaração de sua atitude em relação a mim. É melhor saber do que não saber.

 

Espero que você realmente entenda, você fez um grande trabalho de Aconselhamento prejudicial - como não escrever para o Service Desk

 
Rashid Umarov:

Espero que você realmente entenda, você fez um grande trabalho de Aconselhamento prejudicial - como não escrever para o Service Desk


Infelizmente, eu não entendi. Tentei ser tão claro e específico quanto possível em minha mensagem. Eu dei detalhes, dei um arquivo gif, comentei o código do roteiro. Então o que exatamente eu fiz de errado?

 

Você realmente não consegue ler a ajuda e mudar o código corretamente? Como você pode então exigir uma atitude diferente? Aqui está o código da ajuda, com as adições destacadas em amarelo

//+------------------------------------------------------------------+
//|                                                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:

Você é realmente incapaz de ler a ajuda e mudar o código corretamente? Como você pode pedir uma atitude diferente? Aqui está o código da ajuda, com os acréscimos em amarelo

Se a atitude para com minha pessoa depende de eu ter cometido um erro no código, então temo que algo esteja errado aqui...)

Eu ainda não entendo realmente suas reivindicações.

Eu coloquei meu código alterado mais de uma vez no fórum. Meu único erro foi que depois de adicionar o fechamento explícito do arquivo, esqueci de salvar novamente o script e, portanto, não vi que ele resolvia o problema no script que eu mudei. No entanto, em qualquer caso, a documentação não diz explicitamente que você tem que fechar os arquivos após a criação.

Passado isso, como eu disse antes, meu problema de apagar pastas (nota e não arquivos) ainda permanecia. As pastas não têm mais arquivos, mas a função FolderClean as apaga.

A causa ainda não está clara.

Então, talvez eu tenha ido ao Service Desk por uma razão afinal de contas.

Obrigado por ter levado tanto tempo para considerar meu problema)).

 
Реter Konow:
Obrigado. Ainda bem que eu não sou o único que enfrenta este problema. Preciso resolver este problema (não posso terminar de usar o navegador de arquivos sem ele). Eu escrevi para o servicedeck. Mas estou escrevendo aqui também só por precaução. Não foi em vão).
fxsaber:

Eu já vi este tipo de coisa acontecer mais de uma vez. Descobri que em algum momento a pasta Arquivos com todas as subpastas e arquivos recebe atributo somente leitura. Desmarcar esta bandeira manualmente não ajuda. Mas o reinício do terminal sempre ajuda. Não conseguiu fazer com que ele jogasse (não tentou), então não informou à SD.

Adesão. Tive anteriormente acidentes extremamente raros, desde o início de 2014, que geraram um erro de "32 de violação de compartilhamento" do SO em 9 tentativas de criar um arquivo nesta pasta, indo em incrementos de 16 milissegundos seguidos. Eu não conseguia descobrir o que estava errado. Eu o culpei pela "atualização radical das funções de manuseio de arquivos" que estava acontecendo no MQ na época. Também não se pode reproduzir, só por coincidência, houve tal falha há pouco, às 20:12:42. Imediatamente, passados alguns segundos, foi para um arquivo naquela pasta, conseguiu editá-lo corretamente e salvá-lo. Falha não capturada.

Antes que esse acidente ocorresse uma ou duas vezes por mês durante 5 anos, desde fevereiro de 2014 deve ser todas as semanas, eu não conto quantas vezes. Embora o número de terminais em funcionamento simultâneo tenha diminuído de 40-50 para 35.

 
Vladimir:

Acompanhamento. Tive uma falha extremamente rara desde o início de 2014, que gerou um erro de "32 de violação de compartilhamento" do SO em 9 tentativas de criar um arquivo nesta pasta, indo em incrementos de 16 milissegundos seguidos. Eu não conseguia descobrir o que estava errado. Eu o culpei pela "atualização radical das funções de manuseio de arquivos" que estava acontecendo no MQ na época. Também não se pode reproduzir, só por coincidência houve esta falha às 20:12:42. Imediatamente, passados alguns segundos, foi para um arquivo naquela pasta, conseguiu editá-lo corretamente e salvá-lo. A falha não é detectada.

Antes disso, durante 5 anos este erro aparecia uma ou duas vezes por mês, desde fevereiro de 2014 invariavelmente todas as semanas, eu não podia contar quantas vezes. Embora o número de terminais em funcionamento simultâneo tenha diminuído de 40-50 para 35.

Eu tenho todos os arquivos apagados, mesmo sem fechá-los explicitamente. Apagadas porque eu não as criei e elas estavam anteriormente dentro da pasta de Arquivos.

O problema é que, para apagar um arquivo, precisamos de sua alça. Entretanto, se não criamos o arquivo, mas apenas o colocamos na pasta FileClose(), não podemos obtê-lo, e portanto não podemos fechá-lo com FileClose().

Ao mesmo tempo, ainda podemos copiá-lo ou apagá-lo. Entretanto, a pasta não pode ser apagada depois disso, nem programática nem manualmente. Manualmente somente depois de reiniciar o terminal.

Tentarei reproduzir o problema mais claramente mais tarde, com exemplos ilustrativos.

 
Реter Konow:

Eu tenho todos os arquivos apagados mesmo sem fechá-los explicitamente. Apagadas porque eu não as criei e elas estavam anteriormente dentro da pasta Arquivos.

A questão é que, para apagar um arquivo, precisamos de sua alça. Entretanto, se não criamos este arquivo, mas apenas o colocamos na pasta FileClose(), não podemos obtê-lo e, portanto, não podemos fechá-lo com FileClose().

Ao mesmo tempo, ainda podemos copiá-lo ou apagá-lo. Entretanto, a pasta não pode ser apagada depois disso, nem programática nem manualmente. Manualmente somente depois de reiniciar o terminal.

Vou tentar reproduzir o problema mais claramente mais tarde, com exemplos claros.

Este é provavelmente o cerne do problema.

Ao renomear uma pasta no navegador de arquivos personalizados, não posso usar FolderRename() porque ela não existe.

Em vez disso, copio todos os arquivos e pastas para uma nova pasta, com um nome personalizado, e excluo os arquivos e pastas originais da pasta original (que renomeio). Como resultado, primeiro apago todos os arquivos da pasta original (depois de copiá-los para a nova pasta) e depois uso FolderClean() para tentar remover a hierarquia de pastas restante na pasta original, que já está vazia. É aqui que ocorre o erro. Algumas pastas são apagadas, mas uma ou duas permanecem, exatamente como a pasta de origem. Em seguida, tento apagá-lo manualmente e ele falha. Somente o reinício do terminal ajuda.

 
Реter Konow:

Este é provavelmente o cerne do problema.

Ao renomear uma pasta no navegador de arquivos personalizados, não posso usar FolderRename() porque ela não existe.

Em vez disso, copio todos os arquivos e pastas para uma nova pasta, com um nome personalizado, e excluo os arquivos e pastas originais da pasta original (que renomeio). Como resultado, primeiro apago todos os arquivos da pasta original (depois de copiá-los para a nova pasta) e depois uso FolderClean() para tentar remover a hierarquia de pastas restante na pasta original, que já está vazia. É aqui que ocorre o erro. Algumas pastas são apagadas, mas uma ou duas permanecem, exatamente como a pasta de origem. Em seguida, tento apagá-lo manualmente e ele falha. Somente o reinício do terminal ajuda.


Por favor, continue - desde que você escreva no fascinante gênero de "ficção". Esperamos que por volta da página 40 você tenha passado para o gênero "literatura técnica".