2009-09-04 7 views
0

У меня есть const char *, который указывает файл, который я хочу удалить. Я хочу использовать RF :: Delete, чтобы удалить файл, который принимает TDesC16 в качестве входного аргумента. Кто-нибудь знает, как легко конвертироватьconst char * to TDesC16

RFs fs; 
TUint err; 

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

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

Большое спасибо,

ответ

-1

Зависит, что кодировка символов строки pFileToDelete. Если вы не знаете, то вам нужно выяснить (или определить его самостоятельно).

Предполагая, что это 7-битный ASCII, то

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

Брекеты есть только потому, что TFileName довольно большой класс (512 байт или так, IIRC), так что вы хотите быть немного осторожны о вводе одного в стеке, и дать ему наименьшую возможную область. Вместо этого вы можете назначить кучу.

Если это UTF-8, то есть еще работа, посмотрите ConvertToUnicodeFromUTF8 в классе CnvUtfConverter.

Обычно лучше определить ваше имя файла как литерал-дескриптор, в первую очередь, если можно.

+0

Нет необходимости в TFileName вообще, у вас уже есть дескриптор в 'wrapper' – Dynite

+0

Я принимал строчку unicode (иначе зачем OP говорил, что 'RFs :: Delete' занимает TDesC16?) , Таким образом, оболочку нельзя передать Delete, потому что это 8-разрядный дескриптор, а не TDesC. –

0

Что-то вдоль этих линий:

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

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

но проверить http://descriptors.blogspot.com

+0

Не отвечает на вопрос. Что, если вопросник не полностью упустил точку дескрипторов, действительно ли нужно преобразовать строку в стиле C, и на самом деле не может просто использовать литерал дескриптора? –

+1

... что не означает, что это неправильный ответ на вопрос, который должен был задать OP *. Возможно, имя файла может быть литералом-дескриптором. Это просто не правильный ответ на вопрос, который действительно задан :-) –

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); 

Я на самом деле не компилируется этот код, чтобы он, возможно, потребуется сом TLC.

+0

«TFileNames никогда не следует выделять в стеке». Symbian это может сказать, но они wusses. Я делал это раньше. Никто не умер, и моя нить 16k стека даже не сделала заметной вмятину в 32 МБ ОЗУ на телефонах, на которых я нацеливался :-) +1, потому что вам было бы сложно написать код для HBufC, и Я не мог. –

+0

Единственное имя TFileName в стеке не представляет проблемы. Проблема в том, что вы должны гарантировать, что никакой путь вызова в вашей программе не содержит слишком много TFileNames или других больших объектов стека. – Ola