2010-12-31 15 views
6

पर कौन सी त्रुटियां हो रही हैं, मैं रीसाइक्लिंग बिन में फ़ाइल भेजने के लिए SHFileOperation() फ़ंक्शन का उपयोग कर रहा हूं और मुझे 2 त्रुटियां मिल रही हैं जो मुझे नहीं पता कि उनका क्या मतलब है क्योंकि इस फ़ंक्शन के साथ त्रुटि कोड GetLastError() मान नहीं हैं।SHFileOperation का उपयोग करना:

जब फ़ंक्शन SHFileOperation() विफल मान विफल रहता है 0x57 (दशमलव 87) और 0x2 (दशमलव 2)। क्या कोई मुझे इन त्रुटियों की परिभाषाओं की खोज करने में मदद कर सकता है (विशेष रूप से जब आप इस फ़ंक्शन के साथ विचार करते हैं, तो त्रुटियां GetLastError() कोड का हिस्सा नहीं हैं)।

कुछ महत्वपूर्ण जानकारी:

  • मैं विंडोज 7 का उपयोग कर रहा (& मुझे पता है कि MSDN SHFileOperation के बजाय IFileOperation उपयोग करने के लिए कहते हैं, लेकिन मैं जो मेरे ऐप पीछे की ओर संगत बनाने के लिए कारण है कि मैं SHFileOperation उपयोग कर रहा हूँ चाहते हैं) । अगर त्रुटि हो रही है क्योंकि मैं विंडोज 7 पर SHFileOperation का उपयोग कर रहा हूं, तो मैं इस काम को 2000 & से विंडोज़ के सभी संस्करणों पर बनाने के लिए किस समाधान का उपयोग कर सकता हूं?

  • मैंने बड़े पैमाने पर & को डीबग किया है, जहां तक ​​मुझे पता है कि मेरा SHFILEOPSTRUCT सही है (सही झंडे का उपयोग किया जाता है, .pFrom एक डबल-नल एंड स्ट्रिंग है)। एक चीज जिसे मैं निश्चित रूप से जानता हूं वह यह है कि फ़ाइल का मेरा पथ सही है (वास्तविक फ़ाइल & पर यह सही ढंग से स्वरूपित होता है)।

  • बारे में 2/5 बार SHFileOperation() काम करता है, जिसका अर्थ यह रीसायकल बिन & एक त्रुटि

रिटर्न नहीं है करने के लिए फ़ाइल भेजता है।

BOOL result; 
SHFILEOPSTRUCT fileStruct; 
fileStruct.hwnd = hwnd; 
fileStruct.wFunc = FO_DELETE; 
fileStruct.pFrom = dest.c_str(); 
fileStruct.fFlags = FOF_FILESONLY; // FOF_ALLOWUNDO 
fileStruct.fAnyOperationsAborted = result; 

// Call operation(delete file) 
int success = SHFileOperation(&fileStruct); 

// if delete was successful 
if (success != 0) 
{ 
    printf("%s \t %X %d \n", dest.c_str(), success, success); 
    cout << result << endl; 

    MessageBox(hwnd, "Failed to delete file", "Error", MB_OK|MB_ICONERROR); 
    return; 
} 
+0

आप टिप्पणी भ्रामक है। आपको इसे उसी पंक्ति में पास करना चाहिए जैसे कि अगर ब्लॉक के अंदर या अंदर और इसे विफल होने पर इसे // // में बदल दें – sergiol

उत्तर

0

SHFileOperation प्रलेखन के अनुसार, उन त्रुटियों मानक Windows त्रुटि कोड WinError.h से आप this page on MSDN में उन त्रुटि कोड देखने कर सकते हैं करने के लिए नक्शे।

आपका त्रुटियों प्रतीत होता:

ERROR_FILE_NOT_FOUND 2 (0x2) प्रणाली निर्दिष्ट फ़ाइल नहीं मिल रहा।

और

ERROR_INVALID_PARAMETER 87 (0x57) पैरामीटर सही नहीं है।

5

जैसा कि shf301 ने कहा, त्रुटि कोड 87 ERROR_INVALID_PARAMETER है। ऐसा शायद इसलिए होता है क्योंकि आप अप्रयुक्त SHFILEOPSTRUCT फ़ील्ड की सामग्री प्रारंभ नहीं कर रहे हैं, इसलिए उनमें यादृच्छिक मान होंगे। documentation कहता है कि pTo "अगर इसका उपयोग नहीं किया जाता है तो उसे पूर्ण पर सेट किया जाना चाहिए"; ओएस इस क्षेत्र के मूल्य की जांच कर रहा है और अगर यह गैर-नल है तो एक त्रुटि लौटा रहा है।

पहले कोई एक कार्य करके शून्य करने के लिए सब कुछ सेट:

SHFILEOPSTRUCT fileStruct = { 0 }; 

या

SHFILEOPSTRUCT fileStruct; 
ZeroMemory(&fileStruct, sizeof(SHFILEOPSTRUCT)); 

त्रुटि कोड 2 ERROR_FILE_NOT_FOUND है; यह संभवतः इस त्रुटि कोड को अनदेखा करना सुरक्षित है यदि यह संभव है कि फ़ाइल मौजूद न हो, या आपके प्रोग्राम को इसे हटाने का प्रयास करने से पहले उपयोगकर्ता ने इसे हटा दिया हो। (ध्यान दें कि भले ही आप इसे हटाने का प्रयास करने से पहले फ़ाइल मौजूद हैं, फिर भी एक और प्रक्रिया इसे हटा दे सकती है, इसलिए आपको हमेशा इस त्रुटि को संभालने की आवश्यकता होगी।)

3

इस स्निपिट के साथ कुछ गंभीर समस्याएं, मैं SHFILEOPSTRUCT structure

  1. पीएफआरओएम को दोगुना शून्य समाप्त होना चाहिए। मुझे नहीं पता कि किस प्रकार का dest है लेकिन यह लगभग निश्चित रूप से एक दोगुनी शून्य समाप्त स्ट्रिंग वापस नहीं कर रहा है।

  2. पीटीओ पैरामीटर न्यूल पर सेट किया जाना चाहिए यदि इसका उपयोग नहीं किया जाता है। वाइल्डकार्ड वर्णों की अनुमति नहीं है। उनके उपयोग से अप्रत्याशित परिणाम सामने आएंगे।

  3. सुरक्षित अभ्यास struct पर शून्य स्मृति कॉल करने के लिए इससे पहले कि आप

    SHFILEOPSTRUCT shStruct भरने हो सकता है;
    ज़ीरोमेमरी (& shStruct, sizeof (SHFILEOPSTRUCT));

  4. fileStruct.fAnyOperationsAborted = परिणाम; फ़ंक्शन को परिणाम में वापस नहीं लाएगा। SHFILEOPSTRUCT स्टैक पर मौजूद है और आसानी से कॉल

इन मुद्दों को स्वयं प्राप्त होने वाले त्रुटि कोडों को समझाएं।

संबंधित मुद्दे