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

 

Amanhã vou tentar fazer um roteiro que reproduza totalmente este problema.

Assim, as pessoas não vão dizer que estou fazendo "ficção" aqui).

Muito obrigado a todos vocês por sua disposição de ajudar e ajudar na solução do problema. ))

 

Houve um erro flutuante como este (a seqüência é descrita e um arquivo .ex5 da biblioteca foi anexado). É difícil documentar este tipo de coisa

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

Bichos, insetos, perguntas

A100, 2016.08.04 00:05

Erro ao abrir o arquivo pelo Consultor Especialista. E se, por exemplo.

1. remover "algum código irrelevante" (ver abaixo)

2. ou remover ::Dormir(1000)

não há erro

//Test.mq5
#import "Test001.ex5"
        string f( string file );
#import
string __Period() { return StringSubstr( EnumToString((ENUM_TIMEFRAMES)Period()), 7 ); }
void OnInit()
{
        Print( Symbol(), ",", __Period(), ", результат=", f( "test.txt" ));
}

Seqüência de ações:

1. Criar um novo perfil (por exemplo, "Teste")

2. abrir dois novos gráficos anexando o Test.ex5 Expert Advisor a ambos (ver foto)

4. Selecione qualquer outro perfil existente

5. Selecione o perfil "Test".

resultado:

Enquanto o Test001.mq5 tem este aspecto:

//Test001.mq5
#property library
//---
//здесь некий код не имеющий отношения к делу
//---
string f( string file ) export
{
        ::ResetLastError();
        int hFile = ::FileOpen( file, FILE_READ | FILE_SHARE_READ | FILE_TXT | FILE_ANSI | FILE_COMMON );
        if ( hFile == INVALID_HANDLE )
                return ::StringFormat( "Error(%d): Не был открыт файл: %s", ::GetLastError(), file );
        ::Sleep( 1000 );
        ::FileClose( hFile );
        return "OK";
}

Tentado agora com o arquivo da biblioteca anexado: o resultado é o mesmo (o arquivo de teste é aberto separadamente pelos dois EAs, e se simultaneamente, um dos EAs relata um erro)
2017.08.28 23:40:43.623 Teste (EURUSD,M15) EURUSD,M15, resultado=OK
2017.08.28 23:40:52.389 Teste (GBPUSD,M15) GBPUSD,M15, resultado=OK

2017.08.28 23:41:14.387 Teste (GBPUSD,M15) GBPUSD,M15, resultado=Error(5004): Arquivo não foi aberto: test.txt
2017.08.28 23:41:15.484 Teste (EURUSD,M15) EURUSD,M15, resultado=OK


 

Encontrado o número de aplicação #1530548, mas sem comentários - pode já ter sido corrigido. Caso contrário, favor rever novamente

 

Реter Konow:

O arquivo é aberto por minha aplicação (navegador de arquivos) para ser sobregravado em outra pasta.

Quando o arquivo é aberto para leitura , obtemos a alça do arquivo.

A etiqueta é Konow:

Depois de escrever por cima, preciso fechar o arquivo, mas não posso - (sem alça) e simplesmente apagar o arquivo.

Para escrever em outro arquivo, eu preciso da manipulação do outro arquivo, por isso faz sentido armazená-lo em outra variável. Após escrever em um novo arquivo, os cabos dos dois arquivos são armazenados em duas variáveis, e ambos os arquivos são fechados usando esses cabos.

Tag Konow:

Não há nenhuma maçaneta porque o arquivo foi criado desconhecido quando e por quem.

Se o arquivo foi criado por John Doe e John Doe, é MUITO provável que não seja utilizado por nenhuma aplicação. Se você abrir o arquivo para alguma finalidade, então você já tem uma alavanca obtida pela função FileOpen e deve fechá-la antes de apagar a pasta.

Etiqueta Konow:

Dito isto, o arquivo existe dentro da pasta Files e pode ser copiado para outra pasta e apagado posteriormente.

Ao copiar um arquivo de um programa acessível para um programa mql, o manuseio do arquivo é completamente desnecessário.

Reg Konow:

Mas você não pode fechar esse arquivo depois de tê-lo copiado. Não há alça.

Após copiar o arquivo, o arquivo não é aberto e não há necessidade de fechá-lo.

Etiqueta Konow:

É provavelmente por isso que apagar ainda mais o FolderClean() com arquivos apagados, não funciona.

Isto é um erro absoluto.

RetagKonow:

Pergunta: Como eu posso obter um controle deste arquivo em um programa MQL?

Do exposto acima, esta pergunta não faz sentido. A manipulação do arquivo só é obtida ao abrir um arquivo para determinar onde o ponteiro do arquivo é FileTell e FileSeek de onde ler ou escrever, para forçar a descarga de dados em disco FileFlush e, é claro, para fechar o arquivo para liberá-lo para outras aplicações para trabalhar nele.


Por acaso, descobri qual é o seu problema:

Durante um experimento, uma pasta é aberta no Explorer ou em outro gerenciador de arquivos para monitorar a criação e exclusão de um arquivo. E uma vez que o arquivo é apagado, a pasta permanece ocupada e não pode ser apagada. O resultado é

2017.08.29 09:42:15.657 Demo_FolderDelete (CADJPY,H4)   Не удалось удалить папку nonempty. Код ошибки=5024

Mas o fato de que, após uma tentativa fracassada de apagar uma pasta, esta pasta continua ocupada, infelizmente, é um fato. Isto agora será objeto de um pedido ao SD.

ps; infelizmente, eu também fiz asneira durante a experiência. Depois de escrever no arquivo, reinicializou os dados em disco, tentou abri-lo com bloco de notas, mas conseguiu em resposta ...(figura) cancelar a tentativa de abrir esqueceu e foi isso que manteve a pasta e não permitiu que fosse apagada.

Resumo: Sem problemas com arquivos mql.

 

Alexey Viktorov:

Completamente por acidente, descobri qual é o seu problema:

Durante um experimento, uma pasta é aberta no Explorer ou em outro gerenciador de arquivos para monitorar a criação e exclusão de um arquivo. E depois de apagar o arquivo, a pasta permanece ocupada e não pode ser apagada. O resultado é

2017.08.29 09:42:15.657 Demo_FolderDelete (CADJPY,H4)   Не удалось удалить папку nonempty. Код ошибки=5024

Mas o fato de que, após uma tentativa fracassada de apagar uma pasta, esta pasta continua ocupada, infelizmente, é um fato. Isto agora será relatado ao RS.

Eu me deparei com este comportamento sob circunstâncias completamente diferentes - também mantendo uma pasta aberta para exclusão, resultando em programas/scripts/SVN etc. não apagando essa pasta.

E a cura é sempre a mesma - derrubar manualmente essa pasta. Portanto, dificilmente é um problema de terminal ou editor.

 
Rashid Umarov:

Eu me deparei com este comportamento sob circunstâncias completamente diferentes - também mantendo uma pasta aberta para exclusão, com o resultado de que programas/scripts/SVN etc. não poderiam excluir a pasta.

E é sempre tratado da mesma maneira - demolindo manualmente a pasta dada. Portanto, dificilmente é um problema de terminal ou editor.

Eu completei meu posto um pouco mais tarde.

Fórum sobre comércio, sistemas comerciais automatizados e estratégias comerciais de teste

Não apagar uma pasta se houver arquivos não fechados nela

Alexey Viktorov, 2017.08.29 08:55


ps; infelizmente, eu também fiz asneira durante a experiência. Depois de escrever para o arquivo, reajustar dados para o disco, tentar abri-lo com o bloco de notas, mas consegui em resposta ...(figura) para cancelar a tentativa de abertura esqueci e foi isso que manteve a pasta e não permitiu que fosse apagada.

Resumo: Sem problemas com arquivos mql.


Estranho que você tenha citado meu post sem este adendo.

 
Alexey Viktorov:

Eu completei meu posto um pouco mais tarde.


Estranho que você tenha citado meu posto sem essa adição.

Só para que você esteja preparado para a resposta do SD.

 
Rashid Umarov:

Só para que você esteja preparado para a resposta do SD.

Então, se eu entendi a razão do problema, por que escrever porcarias do SD? Só não disse em voz alta que me recusava a escrevê-lo... Pensei que era óbvio para todos.
 
Rashid Umarov:

Encontrei este comportamento sob circunstâncias completamente diferentes - também mantendo uma pasta aberta para exclusão, resultando em programas/scripts/SVN etc. não sendo capaz de excluir a pasta.

E a cura é sempre a mesma - derrubar manualmente essa pasta. Portanto, dificilmente é um problema de terminal ou editor.

E o fato de abrir uma pasta em um gerenciador de arquivos, NÃO um ARQUIVO, não afeta sua remoção por mql.

 
Alexey Viktorov:

1. Ao abrir um arquivo para leitura , pegue a alça do arquivo.

2. Para escrever em outro arquivo, precisamos de outro arquivo, por isso é razoável armazená-lo em outra variável. Após escrever para um novo arquivo, os cabos dos dois arquivos são armazenados em duas variáveis, e ambos os arquivos são fechados de acordo com estes cabos.

3. Se o arquivo foi criado desconhecido quando e por pessoa desconhecida, há MUITO boas chances de que o arquivo não esteja ocupado por nenhum pedido. Se você estiver abrindo o arquivo para algum propósito, você já tem uma alça FileOpen e deve fechá-la antes de limpar a pasta.

4. Quando se copia um arquivo de um programa disponível para o mql, o manuseio do arquivo é absolutamente desnecessário.

5. Uma vez copiado um arquivo, esse arquivo não é aberto e não há necessidade de fechá-lo.


1 O cabo é necessário apenas para a função FileClose. Eu não abro o arquivo. Foi criado antes de mim. Eu só o copio e apago. Não posso fechá-lo porque não há alça.

2. Para copiar (FileCopy), para mover (FileMove), o cabo de arquivo não é necessário. Por favor, consulte a documentação.

3 Se eu abrir um arquivo criado por outra pessoa usando a função FileOpen, não conseguirei seu controle. Não se sabe de modo algum qual o manuseio que vou conseguir. Pode ser dele ou pode ser bem diferente. Eu tentei pegar o arquivo de outra pessoa para poder fechar FileClose depois da operação de cópia. Não funcionou.

4. Ao copiar, o cabo não é necessário. É copiado sem nenhum problema. Mas o arquivo é automaticamente aberto para cópia. Além disso, não posso fechá-lo com FileClose porque não há alça. É provavelmente por isso que o FolderClean não funciona depois de apagar os arquivos copiados.

5. Como você sabe que o arquivo não está aberto após a cópia? Não foi explicitamente aberto pela função FileOpen, mas estava sendo copiado com, o que significa que está aberto. Portanto, permanece aberta após a cópia e mesmo após o apagamento. Provavelmente.