|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jul 2006
Messaggi: 1568
|
[C] spostamento file...
Un saluto a tutti intanto!
allora...sto facendo un programmino banale C.. dovrei spostare un pò di file .mp3 in una sola cartella, convertire gli mp3 con un altro bitrate (a questo scopo utilizzo un altro programma però ![]() concettualmente non è difficile perchè memorizzo in un file la path di ciascuna canzone..però il mio problema è questo: utilizzando la funzione system("stringa_comando") ho notato che non funziona sempre; la mia domanda è questa: c'è una libreria in C che faccia questo tipo di cose senza utilizzare delle chiamate di sistema? |
![]() |
![]() |
![]() |
#2 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
per spostare un file usa la funzione link per associargli un nuovo nome e dopo usa unlink per togliergli quello vecchio; su Windows però la link non c'è, devi usare MoveFile(Ex).
Ultima modifica di 71104 : 30-07-2006 alle 15:50. |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Jul 2006
Messaggi: 1568
|
grazie mille! funziona!
![]() una cosa che non ho capito invece...che differenza c'è tra MoveFile() e MoveFileEx() ?? |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jul 2006
Messaggi: 1568
|
nel precedente post non sono stato chiaro, io per spostare i file ho utilizzato la funzione MoveFile(), ma che differenza c'è tra questa e la MoveFileEx()?
|
![]() |
![]() |
![]() |
#5 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
niente di che, semplicemente MoveFileEx ha un parametro in più al quale puoi passare dei flags che ti permettono di impostare alcune caratteristiche dell'operazione; e sto vedendo adesso che in Windows 2000 è stata introdotta anche una certa MoveFileWithProgress che ti permette di impostare una funzione di callback che puoi usare per disegnare il cursorse della percentuale di avanzamento dell'operazione
![]() ![]() |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Jul 2006
Messaggi: 1568
|
infatti ho notato anche io scorrendo un pò la guida...
però non ho capito bene come fare.. ![]() |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Si può anche usare la funzione SHFileOperation (che permette di avere la finestra di progresso "standard" di Windows).
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Jul 2006
Messaggi: 1568
|
e in questo ultimo caso...di che libreria fa parte?
sempre windows.h ?? |
![]() |
![]() |
![]() |
#9 | ||
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
||
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Jul 2006
Messaggi: 1568
|
ok, appena posso provo allora
![]() |
![]() |
![]() |
![]() |
#11 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
si ma windows.h includilo lo stesso quando programmi per Win32
![]() |
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
![]() Qui stiamo moooooolto piú avanti ![]() anziché il cursorse della percentuale di avanzamento abbiamo | / - \ che se li disegni sullo stesso punto velocemente ti danno un effetto di rotolina che gira davvero figa! ![]()
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: May 2000
Messaggi: 1459
|
Quote:
![]() si può fare anche con MoveFileWithProgress cmq ![]() ciau |
|
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Jul 2006
Messaggi: 1568
|
ho provato a vedere i parametri che bisogna passare alla funzione MoveFileWithProgress...e sono questi
BOOL MoveFileWithProgress( LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName, LPPROGRESS_ROUTINE lpProgressRoutine, LPVOID lpData, DWORD dwFlags ); per i primi 2 ok, mentre gli altri 3??? cosa vogliono dire? ![]() |
![]() |
![]() |
![]() |
#15 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
tanto per cominciare tieni presente che la devi usare solo se ti serve realmente di ricevere una chiamata ad una funzione di callback a "progressi regolari" dell'operazione; per es. appunto se devi disegnare qualcosa che mostri l'avanzamento dell'operazione.
al terzo parametro devi passare un puntatore ad una tua funzione, che è la callback: verrà chiamata ad intervalli regolari durante il progredire dell'operazione (vedi MSDN per i dettagli, io non li ricordo). il quarto è un parametro che non serve realmente alla MoveFileWithProgress: la MoveFileEccEcc non fa altro che passare quel parametro alla tua callback ogni volta che la chiama. è un parametro in cui puoi metterci quello che ti pare, secondo le tue necessità: un intero, un puntatore a una struct... se non ti serve puoi anche lasciarlo NULL. l'utilità di ricevere nella callback un parametro che passi alla MoveFileWithProgress sta nel fatto che quel parametro ti permette di ricevere nella callback informazioni strettamente legate a quell'operazione, permettendoti così ad esempio di distinguere un'operazione MoveFileEccEcc dall'altra. se non ci fosse quel parametro e se usassi la stessa routine di callback per operazioni diverse non avresti alcun modo di capire all'interno della callback relativamente a quale operazione la tua routine sta essendo chiamata. infine il quinto parametro sono solo flags, servono ad impostare caratteristiche dell'operazione che non so; come al solito, guarda MSDN per i dettagli. anche qua, se non vuoi passare nessun flag passagli 0. |
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Jul 2006
Messaggi: 1568
|
capito tutto eccetto questo:
"al terzo parametro devi passare un puntatore ad una tua funzione, che è la callback: verrà chiamata ad intervalli regolari durante il progredire dell'operazione (vedi MSDN per i dettagli, io non li ricordo)." la funzione callback quale sarebbe? |
![]() |
![]() |
![]() |
#17 | |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
|
|
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Jul 2006
Messaggi: 1568
|
devo scriverla....o devo chiamarla passando quei parametri no?
|
![]() |
![]() |
![]() |
#19 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
ehm
![]() a costo di ripetermi per la terza volta... ![]() la funzione CopyProgressRoutine la devi scrivere tu, tant'è vero che non è neanche necessario che abbia quel nome, la puoi anche chiamare PippoPlutoEPaperino, basta che abbia lo stesso prototipo (cioè lo stesso tipo di valore di ritorno, la stessa convenzione di chiamata, e gli stessi parametri). |
![]() |
![]() |
![]() |
#20 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Per esempio, una cosa del tipo: Codice:
DWORD CALLBACK MiaFunzioneProgresso (LARGE_INTEGER TotalFileSize, LARGE_INTEGER TotalBytesTransferred, LARGE_INTEGER StreamSize, LARGE_INTEGER StreamBytesTransferred, DWORD dwStreamNumber, DWORD dwCallbackReason, HANDLE hSourceFile, HANDLE hDestinationFile, LPVOID lpData) { /* .... visualizzazione progresso .... */ return PROGRESS_CONTINUE; /* vedere gli altri valori PROGRESS_xxx */ } /* dentro un'altra funzione */ ... MoveFileWithProgress (..., ..., MiaFunzioneProgresso, ..., ...); ... Vedere su MSDN CopyProgressRoutine.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 09:24.