Функция PathCombine работает неправильно
У меня возникли некоторые трудности с функцией PathCombine. Кажется, он не работает правильно в сочетании с SHFileOperation(). Мой код выглядит следующим образом:
//beginning of method
TCHAR* root = new TCHAR[MAX_PATH];
root = L"C:\\Users\\jhow\\Desktop\\\0";
//later on in the method
TCHAR* t1Dir = new TCHAR[MAX_PATH]; //root
TCHAR* t2Dir = new TCHAR[MAX_PATH]; //temp
PathCombine(t1Dir,root,L"Folder1\\%REPLACE_THIS%\\\0");
PathCombine(t2Dir,root,L"Folder1\\temp\0");
sf.pFrom = t1Dir;
//sf.pFrom = L"C:\\Users\\jhow\\Desktop\\Folder1\\%REPLACE_THIS%";
sf.pTo = temporaryDir;
//Copy files
int n = SHFileOperation(&sf);
Когда у меня это так, как указано выше, метод видит sf.pTo, но по какой-то причине он не видит sf.pFrom (даже после игры с различными комбинациями \ и \0 в конце имени пути). n становится 2, что, я думаю, означает, что файл не найден... Но, например, когда я закомментирую.
sf.pFrom = t1Dir;
и заменить его на:
sf.pFrom = L"C:\\Users\\jhow\\Desktop\\Folder1\\%REPLACE_THIS%";
SHFileOperation () работает... возвращает ноль, и я вижу, что все файлы скопированы в каталог. Я нахожу это странное видение, поскольку они кажутся одной и той же точной строкой (даже когда я отлаживаю и нахожу переменные)... Кто-нибудь случайно узнал, почему это происходит? Что-то не так с моим синтаксисом или логикой? Потому что я этого не вижу. Я использую Visual Studio 2008. Большое спасибо за ваше время.
1 ответ
Вы выделяете буфер в куче для вашего root
переменная, но затем сразу же указывает эту переменную на строковый литерал только для чтения, утечка выделенного буфера.
Что еще более важно, вы не принимаете во внимание, что SHFileOperation()
работает с двойными нулевыми строками, но PathCombine()
вместо этого возвращает строку с нулевым символом в конце. Вы пытаетесь включить дополнительный ноль в свой вход для PathCombine()
, но это не будет работать, так как PathCombine()
принимать в качестве входных данных одинарные строки с нулевым символом в конце, чтобы он никогда не видел ваши дополнительные нули. Вы должны выделить достаточно места в выходных буферах для хранения дополнительных нулевых терминаторов, а затем убедитесь, что они установлены в нули, прежде чем передавать эти буферы в SHFileOperation()
,
Попробуй это:
LPTSTR root = TEXT("C:\\Users\\jhow\\Desktop\\");
TCHAR t1Dir[MAX_PATH+2] = {0};
TCHAR t2Dir[MAX_PATH+2] = {0};
PathCombine(t1Dir, root, TEXT("Folder1\\%REPLACE_THIS%\\"));
PathCombine(t2Dir, root, TEXT("Folder1\\temp"));
sf.pFrom = t1Dir;
sf.pTo = t2Dir;
int n = SHFileOperation(&sf);