View Full Version : [C] System: "rm" di Linux diventa "del" su Win32?!
Matrixbob
06-07-2007, 09:20
system("rm ./tmp/*");
system("rm ./log/*");
system("rm ./tts/*");
system("rm -r canale*");
diventano
system("del ./tmp/*");
system("del ./log/*");
system("del ./tts/*");
system("deltree canale*");
:confused: :mbe: :confused:
Matrixbob
06-07-2007, 09:21
Pensavo di programare multipiattaforma ed allora se fallisce la system con RM esegui la sistem con DEL.
Questo volevo fare. :rolleyes: :)
Matrixbob
06-07-2007, 09:42
DOS Linux
---------------------------------------------------------------------
C:\GUIDO>DIR $ ls
C:\GUIDO>DIR FILE.TXT $ ls file.txt
C:\GUIDO>DIR *.H *.C $ ls *.h *.c
C:\GUIDO>DIR/P $ ls | more
C:\GUIDO>DIR/A $ ls -l
C:\GUIDO>DIR *.TMP /S $ find / -name "*.tmp"
C:\GUIDO>CD $ pwd
n/a - vedi nota $ cd
idem $ cd ~
idem $ cd ~/temp
C:\GUIDO>CD \OTHER $ cd /other
C:\GUIDO>CD ..\TEMP\TRASH $ cd ../temp/trash
C:\GUIDO>MD NEWPROGS $ mkdir newprogs
C:\GUIDO>MOVE PROG .. $ mv prog ..
C:\GUIDO>MD \PROGS\TURBO $ mkdir /progs/turbo
C:\GUIDO>DELTREE TEMP\TRASH $ rm -R temp/trash
C:\GUIDO>RD NEWPROGS $ rmdir newprogs
C:\GUIDO>RD \PROGS\TURBO $ rmdir /progs/turbo
Mah, deltree non esiste + a quanto pare.
Suggerimenti per fare: system("rm -r canale*"); ?!
Ovver ocancellare tutte le cartelle chiamate:
canale"qualcosa"
Matrixbob
06-07-2007, 09:48
Forse devo spezzare il comando così:
system("del canale*\*");
system("rd canale*");
Niente, forse:
rd canale* /s /q
Matrixbob
06-07-2007, 09:55
Niente, forse:
rd canale* /s /q
Che balle adesso non prende l'asterisco (*) ...
"La sintassi del nome del file è incorretta", ma che cavolo vuole ancora?
tomminno
06-07-2007, 10:54
Pensavo di programare multipiattaforma ed allora se fallisce la system con RM esegui la sistem con DEL.
Questo volevo fare. :rolleyes: :)
deltree difficilmente lo trovi presente in un sistema Windows.
Matrixbob
06-07-2007, 11:20
deltree difficilmente lo trovi presente in un sistema Windows.
Eh infatti non c'è. :(
Altre soluzioni?!
Altre soluzioni?!Usare ad esempio la API Win32 SHFileOperation, che tra l'altro consente anche di mostrare una dialog di "progress".
Matrixbob
06-07-2007, 11:39
Usare ad esempio la API Win32 SHFileOperation, che tra l'altro consente anche di mostrare una dialog di "progress".
Puoi farmi, se hai tempo, un esempio esplicativo di come si usa?
Puoi farmi, se hai tempo, un esempio esplicativo di come si usa?Una cosa del genere (senza usare la dialog di progress, cioè in modo "silenzioso"):
#define STRICT
#include <windows.h>
#include <shellapi.h>
#include <stdio.h>
BOOL DeleteDirTree (LPSTR lpszPath)
{
SHFILEOPSTRUCT shfops;
ZeroMemory (&shfops, sizeof (shfops));
shfops.wFunc = FO_DELETE;
shfops.fFlags = FOF_NOCONFIRMATION | FOF_SILENT | FOF_NOERRORUI;
shfops.pFrom = lpszPath;
return SHFileOperation (&shfops) == 0;
}
int main (void)
{
BOOL bRet;
bRet = DeleteDirTree ("C:\\TEMP");
return 0;
}
system("rm ./tmp/*");
system("rm ./log/*");
system("rm ./tts/*");
system("rm -r canale*");
diventano
system("del ./tmp/*");
system("del ./log/*");
system("del ./tts/*");
system("deltree canale*");
:confused: :mbe: :confused:
system("python -c \"import shutil; shutil.rmtree('canale*')\"")
/* eccetera */
:asd:
:asd:
Bello, ma ha la leggera controindicazione che l'interprete Python debba essere installato sulla macchina ospite ;)
#ifdef WIN32 // non mi ricordo se è WIN32 o __WIN32
system("rm ./tmp/*");
system("rm ./log/*");
system("rm ./tts/*");
system("rm -r canale*");
#else
system("del ./tmp/*");
system("del ./log/*");
system("del ./tts/*");
system("deltree canale*");
#endif
Consiglio...sposta tutti questi file in una sottodirectory chiama "data" o qualcosa del genere...
Dopo usi "deltree data" o "rm -rf data"...
Matrixbob
07-07-2007, 11:20
#ifdef WIN32 // non mi ricordo se è WIN32 o __WIN32
system("rm ./tmp/*");
system("rm ./log/*");
system("rm ./tts/*");
system("rm -r canale*");
#else
system("del ./tmp/*");
system("del ./log/*");
system("del ./tts/*");
system("deltree canale*");
#endif
1] Si chiamano MACRO quelle che stai usando con # innanzi?
2] Posso sbatterli così in mezzo al codice sorgente C?
3] #ifdef WIN32, cioè se è definito fai degli rm? Non è il contrario, cioè fai i del?
4] Deltree mi pare che non esista come comando, devo scaricarlo altrove e metterlo nella cartella system32?
1) sì
2) sono direttive al compilatore...se compili per Windows ti compila il primo pezzo di codice, se compili su un so diverso da Windows ti compila il secondo, fanno comunque parte della stessa famiglia delle macro, che si dichiarano con #define
3) sì, è invertito
4) mi sa che l'hanno tolto in XP, una volta nel dos c'era, allora mi sa che ti conviene usare le API che ti ha suggerito andbin
Ovviamente:
#ifdef WIN32
#define STRICT
#include <windows.h>
#include <shellapi.h>
BOOL DeleteDirTree (LPSTR lpszPath)
{
SHFILEOPSTRUCT shfops;
ZeroMemory (&shfops, sizeof (shfops));
shfops.wFunc = FO_DELETE;
shfops.fFlags = FOF_NOCONFIRMATION | FOF_SILENT | FOF_NOERRORUI;
shfops.pFrom = lpszPath;
return SHFileOperation (&shfops) == 0;
}
#endif
Matrixbob
07-07-2007, 11:29
Consiglio...sposta tutti questi file in una sottodirectory chiama "data" o qualcosa del genere...
Dopo usi "deltree data" o "rm -rf data"...
Quindi intendi così?
#ifdef WIN32
system("rd /s /q data");
#else
system("rm -rf data");
#endif
:stordita:
-r = ricorsivo, ma -f?
Ah hanno messo la possibilità di rimuovere le sottodirectory con rd...buon a sapersi ;)
-f Non chiede conferme. Non scrive messaggi diagnostici. Non pro‐
duce un stato di ritorno d’errore se gli unici errori erano file
inesistenti.
Matrixbob
07-07-2007, 11:44
Ah hanno messo la possibilità di rimuovere le sottodirectory con rd...buon a sapersi ;)
-f Non chiede conferme. Non scrive messaggi diagnostici. Non produce un stato di ritorno d’errore se gli unici errori erano file inesistenti.
Questo sempre per tutti i comandi Linux o solo per rm?
Solo per rm, poi ogni comando ha storia a se...magari qualcuno ha la stessa opzione...
Matrixbob
12-07-2007, 13:10
questo non me lo fa fare
mkdir ./data/canale1
, la sintassi è errata dice.
Come faccio a lanciare + comandi dalla stessa riga di comando?
Avevo in mente di fare
mkdir data
cd data
mkdir canale1
oppure se la shell lo accettasse qualcosa del tipo
shell> mkdir data; cd data; makdir canale1
, se avete altre idee sono tutto occhi. :)
questo non me lo fa fare
mkdir ./data/canale1
, la sintassi è errata dice.Su linux è corretta, e funziona a patto che la directory 'data' sia già esistente.
oppure se la shell lo accettasse qualcosa del tipo
shell> mkdir data; cd data; makdir canale1Su linux è così. Più comandi separati da ; vengono eseguiti sequenzialmente dalla shell.
Matrixbob
12-07-2007, 13:33
Errore:
http://img513.imageshack.us/img513/8194/asdwo3.gif
Frammento di codice interessato:
// inizializzo la stringa vuota col carattere \0
memset(comando, 0, SIZEBUF);
sprintf(comando, "mkdir data");
printf("Lanciato comando> %s\n", comando);
system(comando);
// inizializzo la stringa vuota col carattere \0
memset(comando, 0, SIZEBUF);
sprintf(comando, "mkdir ./data/canale%d", canale_numero);
printf("Lanciato comando> %s\n", comando);
system(comando);
// inizializzo la stringa vuota col carattere \0
memset(comando, 0, SIZEBUF);
sprintf(comando, "wget \"%s\" -T 30 -o ./log/enclosure_item%d.log -O ./data/canale%d/%s", input, count_item, canale_numero, enclosure_nomefile);
printf("Lanciato comando> %s\n", comando);
system(comando);
Matrixbob
12-07-2007, 13:35
Questo nuovo problema mi nasce dal fatto che ho seguito il consiglio di Cionci e messo tutto nella cartella "data" per poi rimuovere tutto in blocco col comando di Winzoz "RD nome_dir /opz /opz".
Giustamente risolto 1 problema ne spunta 1 altro. :)
Matrixbob
12-07-2007, 13:40
Se faccio così
shell> mkdir data; cd data; makdir canale1
mi crea tutte cartelle:
cd, data, mkdir. L:DL
Ma l'errore lo ha su Windows o su Linux ?
Attento che il separatore di percorsi su Windows è \ e non /...
Matrixbob
12-07-2007, 17:09
Ma l'errore lo ha su Windows o su Linux ?
Attento che il separatore di percorsi su Windows è \ e non /...
Sono su WinXP e sto usando il MinGW.
La prima cosa che mi è venuta in mente è di mettere gli "\" o gli "/", ma niente da fare.
Pare che la funzione system non interpreti il parametro "-p" :boh:, perchè quando uso "mkdir -p data\\canale" mi crea anche le cartella "-p" e "data", sto strunz. :)
Ho chiesto anche qui:
[SHELL] + comandi x linea è possibile? (http://www.hwupgrade.it/forum/showthread.php?p=17898299)
Matrixbob
12-07-2007, 18:12
L'opzione è /p non -p
Grazie, l'ho segnalato di la.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.