Répertoire et sous répertoire

afavre69 Messages postés 6 Date d'inscription samedi 1 mars 2008 Statut Membre Dernière intervention 13 octobre 2008 - 13 oct. 2008 à 16:53
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 13 oct. 2008 à 20:18
Bonjour à Tous,

J'ai un petit problème avec mon  code...

Dans mon appli, j'ai une listview dasn laquelle se trouve des fichiers à copier sur clé usb. Je veux conserver la structure des fichiers, c'est dire dossier et sous dossier (exemple: \Dossier1\Dossier2\fichier1.doc )
Je fais appel a une fonction CreateDir();
Sous Vista, ça marche sans aucun problème, mais sous Windows XP, seul le dossier \Dossier1 est crée sur la racine de ma clè USB.

Voici mon code :

int

CreateDir(TCHAR *rep){

HANDLE hdl ;
TCHAR tmp[MAX_PATH];
TCHAR *p;

if ((hdl = CreateFile(rep, GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS, NULL)) == INVALID_HANDLE_VALUE)
MessageBox(NULL, rep, APPNAME, MB_OK);
{

// le directory n'existe pas, on essaye de le créer
if (CreateDirectory(rep, NULL) == FALSE)
{

// echec de la création, on teste pour savoir si le père existe
ZeroMemory(tmp, MAX_PATH);
p = StrRChr(rep,NULL,
'\\');

if (p != NULL)
StrNCpy(tmp, rep, p - rep +1);

else
{
wsprintf(tmp,L
"Impossible1 de créer %s", rep);
MessageBox(NULL, tmp, APPNAME, MB_OK);

return 0;
}

if (CreateDir(tmp) != 0)
{

if (CreateDirectory(rep, NULL) == FALSE)
{
wsprintf(tmp, L
"Impossible de créer %s", rep);
MessageBox(NULL, tmp, APPNAME, MB_OK);

return 0;
}

return 1;
}

// echec création
return 0;
}

// création réussie
return 1;
}

// le répertoire existe déjà, pas la peine de le créer
return 2;
}

et appel de la fonction:

StrCpy(v->szPassDescr,v->bDebugTest?L"Testing":LS("IDS_USBTRANSFERT",APPNAME));
SetDlgItemText(hWnd,IDC_ACTIONSTATUS,v->szPassDescr);
lTotEntries = ListView_GetItemCount(hLV) - 1;
SendDlgItemMessage(hWnd,IDC_PROGRESS,PBM_SETRANGE32,0,lTotEntries);
for ( i=0; i < lTotEntries; i++ ) {
wsprintf(szDest,L"%c:",v->szDrive[0]);
ListView_GetItemText(hLV,i,0,szSource,MAX_PATH);
ListView_GetItemText(hLV,i,1,szBuff,MAX_PATH);
StrCat(szDest,szBuff);
GetFolderName(szDest,szFolder);
   if (CreateDir(szFolder) !=0)
   {
  SendDlgItemMessage(hWnd,IDC_PROGRESS,PBM_SETPOS,i,0);
  wsprintf(szBuf,L"%2d %%",(i*100)/lTotEntries);
  SetDlgItemText(hWnd,IDC_PERC,szBuf);
  CopyUsb(szSource,szDest);
  SetDlgItemText(hWnd,IDC_STATUS,szDest);
  }
  }
  StrCpy(v->szPassDescr,L"");

1 réponse

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 oct. 2008 à 20:18
Où est le CloseHandle() si CreateFile() réussit ???


StrCpy(v->szPassDescr,L"");
v->szPassDescr[0] = 0; // IRA CERTAINEMENT AUSSI BIEN


ListView_GetItemText(hLV,i,0,szSource,MAX_PATH);
ListView_GetItemText(hLV,i,1,szBuff,MAX_PATH);
StrCat(szDest,szBuff);
ListView_GetItemText à remplacer par appel direct de LVM_GETITEMTEXT.
Tu auras ainsi le nbr de caractères copiés en retour, donc plus besoin de strcat().


Venons à ton prob de création de dossiers et sous dossiers:
TCHAR tmp[MAX_PATH], *c, a;
TCHAR drvdest[4];
disons que tu as le fullfilename dans tmp et "R:" dans drvdest:
Inutile de tester l'existence des dossiers (par GetFileAttributes() et non CreateFile()), appel direct de CreateDirectory() sera nettement plus rapide:
tmp[0] = drvdst[0];
c = tmp + 3; DERRIERE le "" racine
while(a = *c) {
  if(a == '\\') {
    *c = 0; // TRONQUE CHAINE PROVISOIREMENT
    CreateDirectory(tmp, 0);
    *c = a; // RESTAURE LA CHAINE
  }
  c++;
}
Ici fini, tu peux copier ton fichier.

ciao...
BruNews, MVP VC++
0
Rejoignez-nous