Per favore continuate - finché scrivete nell'affascinante genere della "fiction". Si spera che a circa pagina 40 sarete passati alla letteratura tecnica.
L'errore è implicito. È difficile dare dettagli più tecnici al momento.
Ho cancellato tutti i file anche senza chiuderli esplicitamente. Cancellati perché non li ho creati io e prima erano dentro la cartella Files.
Il punto è che per cancellare un file, abbiamo bisogno del suo manico. Tuttavia, se non abbiamo creato questo file, ma solo messo nella cartella Files, non possiamo ottenere il suo handle, e quindi non possiamo chiuderlo con FileClose().
Allo stesso tempo, possiamo ancora copiarlo o cancellarlo. Tuttavia, la cartella non può essere cancellata dopo questo, né programmaticamente né manualmente. Manualmente solo dopo aver riavviato il terminale.
Cercherò di riprodurre il problema più chiaramente più tardi, con esempi illustrativi.
Il codice deve solo essere completo. Se il file è aperto, deve essere chiuso prima dello spegnimento del computer o della chiusura di MT4/5. E preferibilmente, la maniglia deve essere accessibile da qualsiasi luogo del programma. Questo è IMHO. Meglio ancora, chiudete il file immediatamente dopo aver eseguito un'operazione di lettura/scrittura con esso o anche se non dovete fare nulla con esso.
La documentazione di esempio sembra mostrare come non farlo.
È anche molto importante ricordare che quando si scrive su un file, il file scritto può essere letto solo scaricando tutti i dati rimasti nel buffer di I/O del file sul disco usando FileFlush o chiudendo il file. La chiusura del file forzerà un reset dei dati su disco.
Sommario: se aprite un file, non dimenticate di chiuderlo. E l'handle del file non sarà perso.
Il codice deve semplicemente essere completo. Se un file è aperto, dovrebbe essere chiuso prima di spegnere il computer o chiudere MT4/5. E la maniglia, preferibilmente, dovrebbe essere accessibile da qualsiasi punto del programma. Questo è IMHO. Meglio ancora, chiudete il file immediatamente dopo aver eseguito un'operazione di lettura/scrittura con esso o anche se non dovete fare nulla con esso.
La documentazione di esempio sembra mostrare come non farlo.
È anche molto importante ricordare che quando si scrive su un file, il file scritto può essere letto solo scaricando tutti i dati rimasti nel buffer di I/O del file sul disco usando FileFlush o chiudendo il file. La chiusura del file forzerà un reset dei dati su disco.
Sommario: se aprite un file, non dimenticate di chiuderlo. E l'handle del file non sarà perso.
Ancora una volta, posso chiudere un file creato dal mio programma usando la funzione FileClose() - ho il suo handle.
Non posso chiudere un file creato da qualcun altro, ma esistente nella cartella Files, perché non ho un handle per esso.
Se copio un file che non è stato creato da me (non dal mio programma), allora non posso chiuderlo dopo la copia con la funzione FileClose() (nessun handle), MA posso cancellarlo.
Forse è per questo che le cartelle con file copiati e cancellati non vengono eliminate dalla funzione FolderClean(). Probabilmente, perché non sono stati chiusi dopo essere stati copiati.
MA NON SI POSSONO CHIUDERE PERCHÉ NON HANNO UNA MANIGLIA!
1. come posso ottenere l'handle del file che è stato creato nella cartella Files prima di caricare lo script?
2. Il problema di cancellare le cartelle usando FolderClean(), dopo aver cancellato i file in esse che sono stati precedentemente copiati in un'altra cartella e non chiusi dopo la copia (perché non c'è un handle), potrebbe avere la causa di cui sopra?
1. come posso ottenere l'handle del file che è stato creato nella cartella Files prima di caricare lo script?
2. Il problema di cancellare le cartelle usando la funzione FolderClean(), dopo aver cancellato i file in esse che sono stati precedentemente copiati in un'altra cartella e non chiusi dopo la copia (perché non c'è un handle), potrebbe avere la ragione di cui sopra?
Questa è una specie di base del sistema operativo. Se un'applicazione ha aperto un file per la scrittura, né quel file né la cartella che lo contiene possono essere cancellati. Prova ad aprire un file in Word e poi usa gli strumenti del sistema operativo per cancellare la cartella in cui si trova. Cosa succederà? Non potrai farlo, perché non avrai accesso ad esso.
Bene, potete ottenere il manico del file. Ma a cosa servirebbe una tale azione? Dopo tutto, se il file viene aperto da un'altra applicazione, vedrete la dichiarazione precedente. Otterremo solo un handle che è valido nella nostra applicazione.
Questa è una specie di base del sistema operativo. Se un'applicazione ha aperto un file per la scrittura, né il file né la cartella che lo contiene possono essere cancellati. Prova ad aprire un file in Word e poi usa il sistema operativo per cancellare la cartella in cui si trova. Cosa succederà? Non potrai farlo, perché non avrai accesso ad esso.
Bene, potete ottenere il manico del file. Ma a cosa servirebbe un'azione del genere? Dopo tutto, se il file viene aperto da un'altra applicazione, vedrete la dichiarazione precedente. E possiamo ottenere solo un handle che sia valido nella nostra particolare applicazione.
Il file viene aperto dalla mia applicazione (navigatore di file) per essere sovrascritto in un'altra cartella.
Dopo la sovrascrittura ho bisogno di chiudere il file ma non posso - (nessun handle) quindi cancello semplicemente il file.
Non c'è un handle perché il file è stato creato non si sa quando e non si sa da chi.
Allo stesso tempo, il file esiste nella cartella Files e può essere copiato in un'altra cartella e poi cancellato.
Ma dopo la copia, il file non può essere chiuso. Non c'è nessuna maniglia.
Questo è probabilmente il motivo per cui l'ulteriore cancellazione di cartelle FolderClean() con file cancellati non funziona.
Domanda: come faccio a portare l'handle di questo file nel programma MQL?
2017.08.2822:20:53.474 Terminal MetaTrader 5 x64 build 1653 started (MetaQuotes Software Corp.)
2017.08.2822:20:53.476 Terminal Windows 10 Pro (x64 based PC), IE 11.00, UAC, Intel Core i3-3120 M @ 2.50 GHz, RAM: 4830 / 8077 Mb, HDD: 315702 / 475588 Mb, GMT+02:002017.08.2822:20:53.476 Terminal C:\Users\barab\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075
Al momento dei test, la cartella "test" è stata creata in [data folder]\MQL5\Files e in essa è stato creato il file di testo "source.txt" con il seguente contenuto:
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
);
Quindi, passo 1: copiare il file "source.txt" in un altro utilizzando gli strumenti MQL5
Script:
//--- 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);
}
//+------------------------------------------------------------------+
Passo 2: Pulizia della cartella "test" con gli strumenti MQL5
Grazie per questo esempio. Ci penserò domani mattina. Non ho l'energia in questo momento).
Proverò tutto e vi darò una risposta.
Aggiunto:
Lei ha citato tre scritture diverse qui.
Ho un programma e la copia, la cancellazione di file e cartelle avviene all'interno di una funzione in due cicli.
Entrare nel primo ciclo: prima i file sorgente vengono copiati in un'altra cartella, poi questi file sorgente vengono cancellati. Uscire dal primo ciclo.
Entriamo nel secondo ciclo: cancelliamo la cartella di origine con FolderClean() e cancelliamo la cartella di origine con -FolderDelete().
Poi guardiamo nel navigatore di file nel meta-editor e vediamo che la cartella di origine è stata parzialmente cancellata. Le sottocartelle che non avevano file sono state completamente cancellate e quelle che avevano alcuni file non sono state cancellate, ma sono vuote.
Cercando di eliminare manualmente le cartelle - abbiamo capito:
Poi chiudiamo il terminale e lo riavviamo. Vediamo che alcune sottocartelle sono scomparse da sole, altre sono rimaste. Li cancelliamo manualmente senza problemi. Questa volta.
Per favore continuate - finché scrivete nell'affascinante genere della "fiction". Si spera che a circa pagina 40 sarete passati alla letteratura tecnica.
Ho cancellato tutti i file anche senza chiuderli esplicitamente. Cancellati perché non li ho creati io e prima erano dentro la cartella Files.
Il punto è che per cancellare un file, abbiamo bisogno del suo manico. Tuttavia, se non abbiamo creato questo file, ma solo messo nella cartella Files, non possiamo ottenere il suo handle, e quindi non possiamo chiuderlo con FileClose().
Allo stesso tempo, possiamo ancora copiarlo o cancellarlo. Tuttavia, la cartella non può essere cancellata dopo questo, né programmaticamente né manualmente. Manualmente solo dopo aver riavviato il terminale.
Cercherò di riprodurre il problema più chiaramente più tardi, con esempi illustrativi.
Il codice deve solo essere completo. Se il file è aperto, deve essere chiuso prima dello spegnimento del computer o della chiusura di MT4/5. E preferibilmente, la maniglia deve essere accessibile da qualsiasi luogo del programma. Questo è IMHO. Meglio ancora, chiudete il file immediatamente dopo aver eseguito un'operazione di lettura/scrittura con esso o anche se non dovete fare nulla con esso.
La documentazione di esempio sembra mostrare come non farlo.
È anche molto importante ricordare che quando si scrive su un file, il file scritto può essere letto solo scaricando tutti i dati rimasti nel buffer di I/O del file sul disco usando FileFlush o chiudendo il file. La chiusura del file forzerà un reset dei dati su disco.
Sommario: se aprite un file, non dimenticate di chiuderlo. E l'handle del file non sarà perso.
Il codice deve semplicemente essere completo. Se un file è aperto, dovrebbe essere chiuso prima di spegnere il computer o chiudere MT4/5. E la maniglia, preferibilmente, dovrebbe essere accessibile da qualsiasi punto del programma. Questo è IMHO. Meglio ancora, chiudete il file immediatamente dopo aver eseguito un'operazione di lettura/scrittura con esso o anche se non dovete fare nulla con esso.
La documentazione di esempio sembra mostrare come non farlo.
È anche molto importante ricordare che quando si scrive su un file, il file scritto può essere letto solo scaricando tutti i dati rimasti nel buffer di I/O del file sul disco usando FileFlush o chiudendo il file. La chiusura del file forzerà un reset dei dati su disco.
Sommario: se aprite un file, non dimenticate di chiuderlo. E l'handle del file non sarà perso.
Ancora una volta, posso chiudere un file creato dal mio programma usando la funzione FileClose() - ho il suo handle.
Non posso chiudere un file creato da qualcun altro, ma esistente nella cartella Files, perché non ho un handle per esso.
Se copio un file che non è stato creato da me (non dal mio programma), allora non posso chiuderlo dopo la copia con la funzione FileClose() (nessun handle), MA posso cancellarlo.
Forse è per questo che le cartelle con file copiati e cancellati non vengono eliminate dalla funzione FolderClean(). Probabilmente, perché non sono stati chiusi dopo essere stati copiati.
MA NON SI POSSONO CHIUDERE PERCHÉ NON HANNO UNA MANIGLIA!
:)))
Domande per gli sviluppatori:
1. come posso ottenere l'handle del file che è stato creato nella cartella Files prima di caricare lo script?
2. Il problema di cancellare le cartelle usando FolderClean(), dopo aver cancellato i file in esse che sono stati precedentemente copiati in un'altra cartella e non chiusi dopo la copia (perché non c'è un handle), potrebbe avere la causa di cui sopra?
Domande per gli sviluppatori:
1. come posso ottenere l'handle del file che è stato creato nella cartella Files prima di caricare lo script?
2. Il problema di cancellare le cartelle usando la funzione FolderClean(), dopo aver cancellato i file in esse che sono stati precedentemente copiati in un'altra cartella e non chiusi dopo la copia (perché non c'è un handle), potrebbe avere la ragione di cui sopra?
Questa è una specie di base del sistema operativo. Se un'applicazione ha aperto un file per la scrittura, né quel file né la cartella che lo contiene possono essere cancellati. Prova ad aprire un file in Word e poi usa gli strumenti del sistema operativo per cancellare la cartella in cui si trova. Cosa succederà? Non potrai farlo, perché non avrai accesso ad esso.
Bene, potete ottenere il manico del file. Ma a cosa servirebbe una tale azione? Dopo tutto, se il file viene aperto da un'altra applicazione, vedrete la dichiarazione precedente. Otterremo solo un handle che è valido nella nostra applicazione.
Questa è una specie di base del sistema operativo. Se un'applicazione ha aperto un file per la scrittura, né il file né la cartella che lo contiene possono essere cancellati. Prova ad aprire un file in Word e poi usa il sistema operativo per cancellare la cartella in cui si trova. Cosa succederà? Non potrai farlo, perché non avrai accesso ad esso.
Bene, potete ottenere il manico del file. Ma a cosa servirebbe un'azione del genere? Dopo tutto, se il file viene aperto da un'altra applicazione, vedrete la dichiarazione precedente. E possiamo ottenere solo un handle che sia valido nella nostra particolare applicazione.
Il file viene aperto dalla mia applicazione (navigatore di file) per essere sovrascritto in un'altra cartella.
Dopo la sovrascrittura ho bisogno di chiudere il file ma non posso - (nessun handle) quindi cancello semplicemente il file.
Non c'è un handle perché il file è stato creato non si sa quando e non si sa da chi.
Allo stesso tempo, il file esiste nella cartella Files e può essere copiato in un'altra cartella e poi cancellato.
Ma dopo la copia, il file non può essere chiuso. Non c'è nessuna maniglia.
Questo è probabilmente il motivo per cui l'ulteriore cancellazione di cartelle FolderClean() con file cancellati non funziona.
Domanda: come faccio a portare l'handle di questo file nel programma MQL?
Questo non sembra essere un problema che abbiamo ancora incontrato nella comunità... :)
Ok, penserò a qualcosa.
Lo faccio sempre).
Sfatare i miti.
Quindi, dati terminali sul sistema operativo:
Al momento dei test, la cartella "test" è stata creata in [data folder]\MQL5\Files e in essa è stato creato il file di testo "source.txt" con il seguente contenuto:
Quindi, passo 1: copiare il file "source.txt" in un altro utilizzando gli strumenti MQL5
Script:
Passo 2: Pulizia della cartella "test" con gli strumenti MQL5
Script:
Passo 3: cancellazione della cartella "test" usando gli strumenti MQL5
Qual è il problema? Tutto funziona.
Qual è il problema? Tutto funziona.
Grazie per questo esempio. Ci penserò domani mattina. Non ho l'energia in questo momento).
Proverò tutto e vi darò una risposta.
Aggiunto:
Lei ha citato tre scritture diverse qui.
Ho un programma e la copia, la cancellazione di file e cartelle avviene all'interno di una funzione in due cicli.
Entrare nel primo ciclo: prima i file sorgente vengono copiati in un'altra cartella, poi questi file sorgente vengono cancellati. Uscire dal primo ciclo.
Entriamo nel secondo ciclo: cancelliamo la cartella di origine con FolderClean() e cancelliamo la cartella di origine con -FolderDelete().
Poi guardiamo nel navigatore di file nel meta-editor e vediamo che la cartella di origine è stata parzialmente cancellata. Le sottocartelle che non avevano file sono state completamente cancellate e quelle che avevano alcuni file non sono state cancellate, ma sono vuote.
Cercando di eliminare manualmente le cartelle - abbiamo capito:
Poi chiudiamo il terminale e lo riavviamo. Vediamo che alcune sottocartelle sono scomparse da sole, altre sono rimaste. Li cancelliamo manualmente senza problemi. Questa volta.