سؤال

أنا برمجة تحت C ++، MFC، ويندوز.

أريد حذف مجلد في سلة المحذوفات. كيف يمكنني أن أفعل هذا؟

    CString filePath = directorytoBeDeletePath;
    TCHAR ToBuf[MAX_PATH + 10];
    TCHAR FromBuf[MAX_PATH + 10];
    ZeroMemory(ToBuf, sizeof(ToBuf));
    ZeroMemory(FromBuf, sizeof(FromBuf));

    lstrcpy(FromBuf, filePath);

    SHFILEOPSTRUCT FileOp;
    FileOp.hwnd = NULL
    FileOp.wFunc=FO_DELETE; 
    FileOp.pFrom=FromBuf;
    FileOp.pTo = NULL;
    FileOp.fFlags=FOF_ALLOWUNDO|FOF_NOCONFIRMATION;
    FileOp.hNameMappings=NULL;
    bRet=SHFileOperation(&FileOp);

أي شيء خاطئ في الكود أعلاه؟ فشلت دائما.

لقد وجدت المشكلة: يجب أن تكون FilePath: "C: ABC" لا "C: ABC "

هل كانت مفيدة؟

المحلول

قيمة الإرجاع من shfileoperation هي int، ويجب أن تحدد رمز الخطأ. ماذا تحصل؟

نصائح أخرى

أعلم أنه ليس بالطريقة الصحيحة ولكن إذا لم تجد حلا، فيمكنك تجربة ذلك ..

قم بتنزيل ملف nircmd.exe أو EXE آخر يمكنه إفراغ سلة المحذوفات.

ثم استدعاء هذه الوظائف حسب النظام ("Nircmd.exe EmertyBin")

لقد وجدت حلا يعمل، لكنه فقط عن طريق الصدفة. المشكلة الفعلية هنا هي أن pFrom المعلمة بتنسيق خاص. وفقا لمستندات MSDN ل shfileopts., ، يقوم بتخزين قائمة مسارات الملفات، كل واحد تم إنهاءه ب Null، وغار إضافي بعد آخر واحد.

في حالتك يحدث هذا العمل لأن FromBuf Array أطول من اسم الملف ويتم تهيئة جميع الإدخالات إلى الصفر. الحل الأكثر عمومية هو إنشاء مخزن مؤقت طويل بما فيه الكفاية لاسم الملف ثم إضافة شخصين NUL بعد ذلك. لاحظ أن أسماء الملفات النوافذ يمكن أطول من ذلك _MAX_PATH, ، على سبيل المثال انظر https://docs.microsoft.com/en-us/windows/desktop/fileio/naming-a-file#maximum-path-limation-limation.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top