C++ 常量字符*至TDesC16

C++ 常量字符*至TDesC16,c++,symbian,descriptor,C++,Symbian,Descriptor,我有一个const char*指定要删除的文件。 我想使用RF::Delete删除一个采用TDesC16的文件 作为输入参数。有人知道如何轻松转换吗 RFs fs; TUint err; const char *pFileToDelete = "c:\\myfile.txt"; if ( fs.Connect () == KErrNone ) { err = fs.Delete(pFileToDelete); fs.Close(); } 非常感谢,取决于字符串的字符编码是

我有一个const char*指定要删除的文件。 我想使用RF::Delete删除一个采用TDesC16的文件 作为输入参数。有人知道如何轻松转换吗

RFs fs;
TUint err;

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

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

非常感谢,

取决于字符串的字符编码是什么
pFileToDelete
。如果你不知道,那么你需要找出(或者自己定义)

假设它是7位ASCII,那么

TPtr8 wrapper(pFileToDelete, User::StringLength(pFileToDelete));
{
    TFileName name;
    name.Copy(wrapper);
    error = fs.Delete(name);
}
之所以有大括号,是因为TFileName是一个相当大的类(512字节左右,IIRC),所以在堆栈上放一个大括号时要稍微小心,并尽可能给它最小的范围。您可以改为堆分配

如果是UTF-8,那么还有更多的工作要做,请查看类
CnvUtfConverter
中的
ConvertToUnicodeFromUTF8


如果可以的话,通常最好首先将文件名定义为描述符文字。

大致如下:

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

RFs fs;
TInt err =fs.Connect();
User::LeaveIfError(err);
err = fs.Delete(filename);
...
但是检查


我还没有编译这段代码,所以它可能需要som TLC

根本不需要TFileName,您已经在“wrapper”中获得了描述符。我假设使用unicode构建(或者为什么OP会说
RFs::Delete
使用TDesC16?)。所以包装器不能传递给Delete,因为它是一个8位描述符,而不是一个TDesC。如果提问者没有完全忽略描述符的意义,真正需要转换一个C风格的字符串,事实上不能只使用描述符文本,那该怎么办?。。。这并不是说对于OP应该问的问题,这是一个错误的答案。也许文件名可以是描述符文字。对于实际提出的问题,这不是一个正确的答案:-)“永远不应该在堆栈上分配TFileNames”。塞班可能会这么说,但他们是胆小鬼。我以前做过。没有人死亡,给我的线程16k堆栈甚至没有对我瞄准的手机上32MB的RAM造成明显的影响:-)+1,因为你可能会费心为HBufC编写代码,而我不能。堆栈上的单个TFileName没有问题。问题是,您必须保证程序中的调用路径不包含太多的TFileName或其他大型堆栈对象。
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);