2009-09-04 7 views
0

J'ai un const char * qui spécifie le fichier que je veux supprimer. Je veux utiliser RF :: Delete pour supprimer un fichier qui prend un TDesC16 comme argument d'entrée. Est-ce que quelqu'un sait comment convertir facilementconst char * à TDesC16

RFs fs; 
TUint err; 

const char *pFileToDelete = "c:\\myfile.txt"; 

if (fs.Connect() == KErrNone) 
{ 
    err = fs.Delete(pFileToDelete); 
    fs.Close(); 
} 

Un grand merci,

Répondre

-1

dépend de ce que le codage de caractères est de la chaîne pFileToDelete. Si vous ne savez pas, alors vous devez le découvrir (ou le définir vous-même).

En supposant que c'est ASCII 7 bits, puis

TPtr8 wrapper(pFileToDelete, User::StringLength(pFileToDelete)); 
{ 
    TFileName name; 
    name.Copy(wrapper); 
    error = fs.Delete(name); 
} 

croisillons sont là juste parce que TFileName est tout à fait une grande classe (512 octets ou si, IIRC), de sorte que vous voulez être un peu méfiant à mettre un sur la pile, et lui donner la plus petite portée possible. Vous pouvez affecter le tas à la place.

Si c'est UTF-8, alors il y a plus de travail à faire, consultez ConvertToUnicodeFromUTF8 dans la classe CnvUtfConverter.

Il est généralement préférable de définir votre nom de fichier en tant que littéral de descripteur en premier lieu, si vous le pouvez.

+0

Le TFileName n'est pas du tout nécessaire, vous avez déjà le descripteur dans 'wrapper' – Dynite

+0

Je supposais un build unicode (ou sinon pourquoi l'OP dirait-il que 'RFs :: Delete' prend un TDesC16?) . Donc wrapper ne peut pas être passé à Delete, car c'est un descripteur 8 bits, pas un TDesC. –

0

Quelque chose le long de ces lignes:

_LIT(KMyFilename,"c:\\myfile.txt"); 
TPtrC filename(KMyFilename); 

RFs fs; 
TInt err =fs.Connect(); 
User::LeaveIfError(err); 
err = fs.Delete(filename); 
... 

mais vérifiez http://descriptors.blogspot.com

+0

Ne répond pas à la question. Que faire si le questionneur ne manque pas complètement le point de descripteurs, a vraiment besoin de convertir une chaîne de style C, et en fait ne peut pas simplement utiliser un descripteur littéral? –

+1

... ce qui ne veut pas dire que c'est une mauvaise réponse à la question que l'OP * aurait dû poser. Peut-être que le nom de fichier peut être un littéral de descripteur. Ce n'est pas juste une bonne réponse à la question réellement posée :-) –

2
RFs fs; 
TUint err; 
const char *pFileToDelete = "c:\\myfile.txt"; 
TPtrC8 filename8 = (const TText8*)pFileToDelete; 
//ok, so we could use a TBuf or a TFileName, but we'd need to now 
//the size of the TBuf at compile time and 
//TFileNames should never be allocated on the stack due to their size. 
//Easier to use a HBufC. 
HBufC* filename = HBufC::NewLC(filename8.Length()); 
//Copy will only do the right thing if the text in pFiletoDelete is 7-bit ascii 
filename->Des().Copy(filename8); 
if (fs.Connect() == KErrNone){   
    err = fs.Delete(*filename); 
    fs.Close(); 
} 
CleanupStack::PopAndDestroy(filename); 

Je ne l'ai pas fait compilé ce code il peut avoir besoin som TLC.

+0

"TFileNames ne devrait jamais être alloué sur la pile". Symbian peut le dire, mais ce sont des wuss. Je l'ai déjà fait. Personne n'est mort, et donner à mon thread 16k de pile n'a même pas fait une brèche appréciable dans les 32 Mo de RAM sur les combinés que je ciblais :-) +1 parce que vous pourriez être dérangé d'écrire le code pour le HBufC, et Je ne pouvais pas. –

+0

Un seul TFileName sur la pile ne pose aucun problème. Le problème est que vous devez garantir qu'aucun chemin d'appel dans votre programme ne contient trop de TFileNames ou d'autres objets de grande pile. – Ola

Questions connexes