نمایش نتایج 1 تا 14 از 14

نام تاپیک: مشكلي با آدرس دهي مسير با SHFileOperation

  1. #1
    کاربر دائمی آواتار A_Salimi
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    North khorasan-Esfarayen
    پست
    372

    Question مشكلي با آدرس دهي مسير با SHFileOperation

    سلام
    من در گزينه هاي pFrom و pTo هر وقت از \ خالي استفاده مي كنم در كپي با مشكل مواجه مي شوم اما هر و قت از \\ استفاده مي كنم مشكلي و جود ندارد با اين حال آدرس هاي من متغيرند و ممكن است براي رايانه هاي متفاوت مقدار هاي متفاوتي بر گردانده شود (چون آدرسها از رجيستري گرفته مي شوند) .براي رفع اين مشكل دقيقا بايد چكار كنم ؟

  2. #2
    کاربر دائمی آواتار hoax3r
    تاریخ عضویت
    مهر 1386
    محل زندگی
    تهران
    پست
    171

    نقل قول: مشكلي با آدرس دهي مسير با SHFileOperation

    در زمان کامپایل مسیر هایی که به صورت یه رشته ثابت هستن و بخوان از این علامت بک اسلش (اگه درست گفته باشم)
    استفاده کنن حتما باید دو تایی قرار بگیره بعد کامپایل به یکی تبدیلش میشه
    ولی اگه یک بک اسلش استفاده کنید چون یکسری کاراکتر ها به همراه این علامت معنی خاصی میدن مثل n\ و r\ و همچنین \\ و ....
    برای همین اگه این ترکیب برای کامپایلر معنا نداشته باشه یا اررور میده یا اگه به ظاهر بدرستی کامپایل بشه نتایج نا مشخصی ممکنه اتفاق بیفته

    مسیرهایی که به این تابع میدین هم باید به 2 تا نول ختم بشه برای نمونه این مثال که در MSDN هست رو ببینید

    // WRONG
    LPTSTR pszSource = L"C:\\Windows\\*";

    // RIGHT
    LPTSTR pszSource = L"C:\\Windows\\*\0";


    تابعی هم به نام PathResolve هست که آدرس یه مسیر رو میگیره و مسیر مناسب برای استفاده
    در تابع SHFileOperation رو فراهم میکنه بد نیست برای اطمینان از این هم استفاده کنید.

  3. #3
    کاربر دائمی آواتار A_Salimi
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    North khorasan-Esfarayen
    پست
    372

    نقل قول: مشكلي با آدرس دهي مسير با SHFileOperation

    متاسفانه مشكل من برطرف نشد.آيا براي تابعي كه در مورد آن اشاره كرديد ميتوانيد مثالي بياوريد؟

    با تشكر

  4. #4
    کاربر دائمی آواتار hoax3r
    تاریخ عضویت
    مهر 1386
    محل زندگی
    تهران
    پست
    171

    نقل قول: مشكلي با آدرس دهي مسير با SHFileOperation

    سلام
    اون تابع کافیه پارامتر اول رو یه رشته یونیکد بدین، این یه مثال

    TCHAR Path[MAX_PATH];

    ...
    ...

    PathResolve(Path, 0, 0);


    البته اینجوری دقیق نمیشه گفت اگر بتونید یه نمونه از اون مسیر هایی که به تابع داده میشه بزارین شاید بهتر بشه گفت

    در MSDN برای تابع SHFileOperation یه جدولی داده حافی لیستی از ایرادات احتمالی
    که میتونید عددی که این تابع بر میگردونه رو در این جدول منطبق کنید، اینجوری احتمالا بتونید مشکل رو پیدا کنید

  5. #5
    کاربر دائمی آواتار A_Salimi
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    North khorasan-Esfarayen
    پست
    372

    نقل قول: مشكلي با آدرس دهي مسير با SHFileOperation

    مسیر های من کاملا عادی هستند مثل :
    C:\Documents and Settings\All Users
    اما چون این مسیر رو از رجیستری دریافت می کنم گاها ممکنه مقادیر متفاوتی دریافت کنم مثل
    C:\Documents and Settings\Ali
    C:\Documents and Settings\Reza
    در MSDN برای تابع SHFileOperation یه جدولی داده حافی لیستی از ایرادات احتمالی
    که میتونید عددی که این تابع بر میگردونه رو در این جدول منطبق کنید، اینجوری احتمالا بتونید مشکل رو پیدا کنید
    مشکل من فقط تبدیل یک بک اسلش به دو بک اسلش کنار هم است.چون حتی از طریق رشته ها و کلاس Cstring هم نتوانستم این رشته ها را به نوع دلخواه تغییر دهم.

  6. #6

    نقل قول: مشكلي با آدرس دهي مسير با SHFileOperation

    قبلا در مورد این موضوع صحبت کرده بودیم، که در مسیرهای معمولی دو بک اسلش (\\) نیاز نیست، اگر دو بار می گذاریم تنها هدف این هست که کامپایلر متوجه شود و یکی از آن ها در رشته ذخیره شود.

    در هر حال، اگر در جایی واقعا نیاز هست که همه \ ها به \\ تبدیل شود به شکل زیر عمل کنید:

    CString str = L"C:\\test\\doc\\";

    int n = str.Find('\\');
    while(n != -1)
    {
    str.Insert(n, '\\');
    n = str.Find('\\', n+2);
    }

  7. #7
    کاربر دائمی آواتار A_Salimi
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    North khorasan-Esfarayen
    پست
    372

    نقل قول: مشكلي با آدرس دهي مسير با SHFileOperation

    سلام

    قبلا در مورد این موضوع صحبت کرده بودیم، که در مسیرهای معمولی دو بک اسلش (\\) نیاز نیست، اگر دو بار می گذاریم تنها هدف این هست که کامپایلر متوجه شود و یکی از آن ها در رشته ذخیره شود.
    معمولا زمانی که از تک بک اسلش استفاده می کنیم کامپایلر warning می دهد :

    unrecognized character escape sequence

    و برای SHFileOperation هم در نهایت error ایجاد می کند.



    اما در مورد جوابی که دادید:

    اگر در جایی واقعا نیاز هست که همه \ ها به \\ تبدیل شود
    در رشته str شما کاملا از دو بک اسلش استفاده کرده اید.با این حال این با حرف

    بالا تناقض ندارد؟

  8. #8
    کاربر دائمی آواتار A_Salimi
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    North khorasan-Esfarayen
    پست
    372

    نقل قول: مشكلي با آدرس دهي مسير با SHFileOperation

    ممکنه این فایل رو ببینید؟(نوشته شده با vc6)
    فایل های ضمیمه فایل های ضمیمه

  9. #9

    نقل قول: مشكلي با آدرس دهي مسير با SHFileOperation

    فکر می کردم قبلا این موضوع را برای شما توضیح داده بودم، که بررسی کردم و دیدم برای فرد دیگری بود. پس این لینک را مطالعه کنید

    مجددا توضیح مختصری:
    در ++C برای اینکه کارکتر \ را در رشته یا یک متغیر کارکتر ذخیره کنید، باید دو مرتبه بنویسید تاکامپایلر بفهمد و یک \ را ذخیره کنید. همان طوری که در لینک فوق هم گفتم شما اگر بنویسید \\\\ یعنی 2 تا \ را دخیره کن و به همین شکل.
    کلا اگر یک مرتبه بنویسید کامپایلر اشتباها کارکتر بعدی را هم در نظر می گیرد و برنامه شما خطا می دهد یا اشتباها کارکتر دیگری را دخیره می کند.

    دقت کنید که این فقط برای مواقعی هست که شما مستقیم رشته را در کدنویسی می نویسید و می خواهید در رشته یا کارکتری ذخیره کنید، مثل مورد زیر:

    char mychar = '\\' ; // store only one \

    char mystr[20] = _T("c:\\folder" ); // store --> c:\folder

    به این گونه کارکتر ها Escape Sequences می گویند (مانند n\ و ?\ و ...) که سایر آن را می توانید از این لینک مشاهده کنید.

    چیزی که ذخیره می شود همان یک مرتبه \ هست.

    تذکر: اگر شما از ورودی مثلا یک EditBox یک مسیر با یک \ دریافت کنید برنامه شما درست جواب می دهد، چون شما فقط عمل کپی محتویات را انجام داده اید، و در کدنویسی داخل برنامه \ ننوشته اید که قرار باشد \\ را بنویسید، هدف نهایی همان ذخیره یک \ در رشته مسیر هست که عمل کپی انجام می دهد.

    در برنامه شما همان کد دکمه دومی درست هست. چون خودتان به شکل کدنویسی دارید \ را ذخیره می کنید پس \\ باید قرار گیرد و اصلا نیاز به تبدیل نیست.



  10. #10
    کاربر دائمی آواتار A_Salimi
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    North khorasan-Esfarayen
    پست
    372

    نقل قول: مشكلي با آدرس دهي مسير با SHFileOperation

    در برنامه شما همان کد دکمه دومی درست هست. چون خودتان به شکل کدنویسی دارید \ را ذخیره می کنید پس \\ باید قرار گیرد و اصلا نیاز به تبدیل نیست.
    در ست است كه قطعه كد دومي درست عمل مي كند اما همانطوري كه قبلا هم گفتم من دارم از رجيستري آدرس مسيري را مي گيرم يعني آدرس ذخيره شده در يك كليد رجيستري كه و قتي آن را مي خوانم و در متغير pTo يا pFrom مي گذارم آن خطا را توليد مي كند.آيا اينجا نيازي به تبديل نيست؟

    همه صحبتهاي بالا كاملا صحيح هستند اما لطفا روشي بگوييد كه هنگامي كه توسط QueryStringValue كليدي را ميخوانم كه آن حاوي يك آدرس است بتوانم آن را به درستي در pTo و بدون خطا استفاده كنم.اگر فكر مي كنيد كه جاي ديگري هم اشتباه مي كنم لطفا راهنمايي كنيد.در ضمن كل رشته ها را در متغير هاي CString ذخيره مي كنم.

  11. #11

    نقل قول: مشكلي با آدرس دهي مسير با SHFileOperation

    اشتباه گفتم کد دومی، منظورم کد اولی بود.
    از رجيستري آدرس مسيري را مي گيرم يعني آدرس ذخيره شده در يك كليد رجيستري كه و قتي آن را مي خوانم و در متغير pTo يا pFrom مي گذارم آن خطا را توليد مي كند.آيا اينجا نيازي به تبديل نيست؟
    نگاه کنید به همین خاطر یک نکته برای شما گفتم:
    تذکر: اگر شما از ورودی مثلا یک EditBox یک مسیر با یک \ دریافت کنید برنامه شما درست جواب می دهد، چون شما فقط عمل کپی محتویات را انجام داده اید، و در کدنویسی داخل برنامه \ ننوشته اید که قرار باشد \\ را بنویسید، هدف نهایی همان ذخیره یک \ در رشته مسیر هست که عمل کپی انجام می دهد.
    وقتی شما از رجیستری مسیر را می خوانید و در CString می ریزید هیچ ربطی به دیدن \\ ندارد، چیزی که شما می گویید نشاندهنده این هست که مشکل برنامه ای که شما درباره اش صحبت می کنید احتمالا ربطی به \\ ندارد. توضیح دادم، شما از رجیستری یا EditBox یا notepad یا IE یا هر کنترل و جای دیگر رشته ای را دریافت کنید و در یک Cstring بریزید باید آن مسیر به شما یک \ نشان دهد. فقط و فقط وقتی \\ مینویسیم که قرار هست مستقیم داخل کدنویسی یا مانند آن رشته را ذخیره کنیم.

    توابع خواندن محتویات رجیستری، محتویات هر کارکتر مسیر را کپی می کند به همین خاطر همواره رشته درست کپی می شود.
    در مورد مشکل شما، بعد از اینکه از رجیستری مسیر را خواندید و در CString کپی کردید، با debugger مشاهده کنید که آیا مسیر شما همان طوری درست با یک \ کپی شده است یا نه، مثلا نباید تمامی \ ها از بین رفته باشد. اگر درست بود بدانید جای دیگری اشتباه می کنید.(یعنی مثلا با debugger رشته باید حاوی چنین چیزی باشد: C:\folder\test)

    اگر یک قطعه کد برای توابعی که ساتفاده کردید قرار دهید بهتر می توانم کمک کنم.

    ضمنا اگر از CString استفاده می کنید هنگام استفاده از رشته مسیر در SHFileOperation، باید از GetBuffer استفاده کنید.

    ضمنا اشتباه دیگری که در کدهای شما هست، رشته های pFrom و pTo باید double-null terminated باشند یعنی خودتان 0\ را مجددا اضافه کنید:


    CString str = L"C:\\folder";
    //int lenCStr = str.GetLength();

    TCHAR cbuff[1025];
    int len = _stprintf( cbuff, L"%s", str.GetBuffer() );
    cbuff[len + 1] = L'\0';
    آخرین ویرایش به وسیله Nima_NF : شنبه 20 تیر 1388 در 13:37 عصر

  12. #12
    کاربر دائمی آواتار A_Salimi
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    North khorasan-Esfarayen
    پست
    372

    نقل قول: مشكلي با آدرس دهي مسير با SHFileOperation

    من یک نمونه کد قرار دادم با همه این باز هم مشکل داره:

    توضیح:

    با فشردن دکمه کلیدی از رجیستری خونده میشه :

    HKEY_LOCAL_MACHINE\SOFTWARE\MyKey


    که شما باید در این شاخه کلیدی از نوع رشته با نام MyPath بسازید.
    و در اون آدرس مقصد رو بنویسید.

    نکته :زمانی که در همین رشته رجیستری از \ استفاده کردم خطا گرفت ولی با \\ جواب داد.خوب ! آیا قبول دارید که در رجیستری همه آدرس ها یه همین شکلند؟بنابراین این مشکل برای همه رشته ها بوجود می آید.ضمنا از کد شما هم در این کدها استفاده کرده ام
    به نظر شما اشکال کجاست ؟

    براي اثبات اين ادعا هم فقط يك حرف دارم :

    من كليدي از رجيستري را خواندم كه مربوط به يك نرم افزار از پيش نصب شده بود و در آن آدرسي ذخيره شده بود اين دفعه هم آن كليد را خواندم و در حقيقت خواستم كه فولدري كه در آن آدرس بود را كپي كنم اما مثل هميشه به اين ييغام رسيدم:


    فایل های ضمیمه فایل های ضمیمه
    آخرین ویرایش به وسیله A_Salimi : شنبه 20 تیر 1388 در 17:46 عصر

  13. #13

    نقل قول: مشكلي با آدرس دهي مسير با SHFileOperation

    خوب باز هم رسیدیم به همان حرف خودم :D

    اشکال کد شما ربطی به \\ در مسیر ندارد، شما در مسیر مقصد (destination) فقط درایو را مشخص کرده اید در حالی که باید یک اسم نیز برای فولدر مقصد خود انتخاب کنید.

    ضمنا چند نکته دیگر هم هست که با وجودی که کلی توضیح دادم (مخصوصا مورد اول)، به آن ها دقت نکردید:

    1- هر دو مورد pFrom و pTo باید شامل دو NULL در انتهای رشته باشند پس 0\ را باید برای هر دو اضافه کنید.
    2- اگر قرار نیست از CString استفاده کنید، نیاز نیست اصلا با آن کاری داشته باشید، من فقط یک مثال برای شما زدم. اگر از TCHAR استفاده می کنید از همان توابع استاندارد C برای طول رشته استفاده کنید.
    3- از پیشوند L فقط برای حالت یونیکد استفاده کنید. برنامه شما در VC++‎6 در حالت اسکی هست.

    با اعمال این تغییرات این کد صحیح هست:

    void CTestpath2Dlg::Oncopy()
    {
    ULONG L1 = 255;
    TCHAR ScrDir[255];
    m_cKey.QueryValue(ScrDir,"MyPath",&L1);

    int len = strlen(ScrDir); // <---------
    ScrDir[len + 1] = '\0'; // <---------

    TCHAR bufDest[100]= "D:\\strDest\0"; // <---------

    SHFILEOPSTRUCT file = {0};
    file.lpszProgressTitle= "Copy my folder";
    file.hwnd=NULL;
    file.wFunc= FO_COPY;
    file.pFrom=ScrDir;
    file.pTo=bufDest;

    file.fFlags=FOF_NOCONFIRMATION|FOF_SIMPLEPROGRESS;

    file.fAnyOperationsAborted=FALSE;
    int err = SHFileOperation(&file);
    }

  14. #14
    کاربر دائمی آواتار A_Salimi
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    North khorasan-Esfarayen
    پست
    372

    نقل قول: مشكلي با آدرس دهي مسير با SHFileOperation

    شما در مسیر مقصد (destination) فقط درایو را مشخص کرده اید در حالی که باید یک اسم نیز برای فولدر مقصد خود انتخاب کنید.
    نه .این دلیل نمی شود شاید بخواهیم فولدر را مستقیما در ریشه درایو مقصد کپی کنیم.

    در هر حال ممنون از اینکه وقت گذاشتید مشکل برطرف شد.

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •