2012-06-01 1 views
0

У меня есть вопрос с участием SHFileOperation:SHFileOperation Удалить когда pFrom = «»

SHFILEOPSTRUCT sf2; 
    memset(&sf2,0,sizeof(sf2)); 
    sf2.hwnd = NULL; 
    sf2.wFunc = FO_DELETE; 
    sf2.fFlags = FOF_NOCONFIRMATION; 
    sf2.pFrom = pathSubDir; // where pathSubDir = "" 

    //2. Delete temporary files 
    int n = SHFileOperation(&sf2); 

Мой Ожидалось, что с pathSubDir был «», он не удаляя и что я должен получить п не равно 0 Но это было не так. Я закончил с n = 0, что означает, что операция была успешно завершена. Мне было любопытно, может ли кто-нибудь объяснить мне, почему мои предположения ошибочны. Спасибо.

+1

Как можно выполнить операцию «удалить ничего»? –

+1

Ситуации, подобные этому, ДЕЙСТВИТЕЛЬНО ТРУДНЫМИ, чтобы дизайнер API мог делать правильные вещи в любой ситуации. Кто-то должен был решить: если пользователь ничего не удалит, сделайте ошибку (в конце концов, ничто уже не удалено, поэтому технически оно удаляется). Точно так же, если вызывающий абонент просит удалить «foo.bar», но нет «foo.bar», то это успех или неудача? Функции IMX, Delete() обычно лучше предполагать успех, когда их вход уже удален. Это означает, что для клиента этой функции требуется меньше проверки, и конечный пользователь больше выбирает то, что хочет удалить. – Mordachai

ответ

1

API требует, чтобы pFrom был с двойным нулевым завершением. Простая пустая строка, такая как "", не подходит. API может считывать любую память после первого нулевого символа и успешно удалять эти файлы.

Другое объяснение, если ваша строка действительно отформатирована правильно, заключается в том, что API успешно удалил все запрошенные файлы и не обнаружил сбоев на этом пути. Он выполнил все удаления, которые вы просили, поэтому он возвращает успех.

+0

Можете ли вы написать простой примерный формат строки, например. «C: \ SomeFolder \ SomeTXT.txt» Правильно ли это жало? –

+0

Нет, это неправильно, @ Саша. Если '' '' не заканчивается с двойным нулевым символом, как я уже сказал в своем ответе, то добавление других ненулевых символов в него не будет внезапным. Если вы хотите больше, чем число нулевых символов по умолчанию в конце строки C (которое равно 1), вам нужно поместить их туда сами. Обратитесь к [вопросу о создании строк с двойным нулевым завершением] (http://stackoverflow.com/q/4611237/33732). –