• 0
هدف الشمالي

[ تمت الإجابة ]فشل نسخ محتويات مجلد إلى مجلد Program Files

سؤال

عندما أقوم بنسخ محتويات مجلد إلى سطح المكتب تنجح العملية ,

ولكن عند محاولة تغيير المسار إلى مجلد Program Files تفشل العملية , وهذا الكود :

 system("xcopy pro_s\\pro C:\\Program Files  /e /i /h");

بحثت ولكن لم أجد الحل .

تم تعديل بواسطه هدف الشمالي
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

7 إجابة على هذا السؤال .

  • 0

يجب أن يكون لديك الصلاحيات اللازمة. شغل برنامجك بالضغط بالزر الأيمن للماوس ثم Run As Administrator.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

يجب أن يكون لديك الصلاحيات اللازمة. شغل برنامجك بالضغط بالزر الأيمن للماوس ثم Run As Administrator.

آسف لم تنجح معي هذه الطريقة , وهي غير مجدية حتى إن نجحت لأني أفكر

توزيع البرنامج ومن غير المقبول أن أنبه كل مستخدم لتشغيل البرنامج بالطريقة المذكورة .

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

المسار :

C:\\Program Files

يحتوي على فراغ في المنتصف, فعلياً سيراه الشل هكذا :

C:\\Program

ضع علامتي تنصيص على المسار ليصبح :

system("xcopy pro_s\\pro \"C:\\Program Files\"  /e /i /h");

الشيء الآخر الوصول لهذا المسار يتطلب صلاحية المدير, لذا تأكد من تشغيل البرنامج بالضغط على زر الفأرة الأيمن وإختر run as administrator.

------------

بدل إستخدام system يمكنك إستخدام الوظيفة SHFileOperation والتي توفر طيف واسع لوظائف النسخ والنقل وإعادة التسمية. تمرر لها بنية إسمها SHFILEOPSTRUCTالرابط الخاص بي وفيها تضع ماتريد من عمليات.

مثال سريع عليها :

#include <windows.h>
#include <shellapi.h>

#include<stdio.h>
#include <stdlib.h>

int main(int argc, _TCHAR* argv[])
{

SHFILEOPSTRUCT shfileopstruct;
/* صفّر محتويات البنية قبل إستخدامها */
ZeroMemory(&shfileopstruct, sizeof(shfileopstruct));

/* إستخدم وظيفة النسخ */
shfileopstruct.wFunc = FO_COPY;
/* لاتظهر للمستخدم نافذة النسخ التابعة لويندوز إذا ظهرت مشكلة */
shfileopstruct.fFlags = FOF_SILENT;
/* حدد مسار المجلد الذي ينتقل منه */
/* تأكّد من إنهائه بـ0\ أخرى */
shfileopstruct.pFrom = TEXT("C:\\SourceDirectory\0");
/* حدد مسار المجلد الذي ينتقل إليه */
/* تأكّد من إنهائه بـ0\ أخرى */
shfileopstruct.pTo = TEXT("C:\\DestinationDirectory\0");

/* إذا نجحت الدالة ستعيد صفر وإذا فشلت ستعيد رقم يمثل سبب الفشل */
if(SHFileOperation(&shfileopstruct) == 0)
printf("OK!\n");
else
printf("Error\n");

system("pause");

return 0;
}

بعد تنفيذه بصلاحية المدير, يفترض أن ينقل المجلد C:\SourceDirectory بما فيه إلى C:\DestinationDirectory.

3

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
توزيع البرنامج ومن غير المقبول أن أنبه كل مستخدم لتشغيل البرنامج بالطريقة المذكورة .

النظام لن يسمح لأي برنامج أن يقوم بمهمة حساسة وغير مصرح له بها. إذا لم يكن هناك إستثناء للخطأ فسيوقف البرنامج. إذا كان برنامجك يتطلب صلاحية الإدارة وكنت تستخدم Visual C++, إضغط على مجلد المشروع بزر الفأرة الأمين وإختر Add ثم New item وأنشئ ملف إسمه my.manifest. إمسح مابه وألصق هذه الأسطر :

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="1.0.0.0"
processorArchitecture="X86"
name="IsUserAdmin"
type="win32"/>
<description>This is my application</description>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>

بعدها من قائمة Project إختر الإختيار الأخير, XXXX properties. من Configuration Properties إختر Manifest Tool ثم Input and Output وفي خانة Additional manifest files إكتب :

$(InputDir)\my.manifest

الآن أعد بناء المشروع, قد تظهر بعض رسائل الأخطاء ولكن تجاهلها. إذهب لمسار الملف التنفيذي. يفترض أن تجد بجانب أيقونة البرنامج صورة درع صغير. عند تشغيله ستظهر مثل هذه الرسالة :

win7install01.png

وسببها أن البرنامج غير موثوق , لم يوقع. ولكن عند تشغيله سيعمل بصلاحية الإدارة ولن يحتاج المستخدم للضغط على run as administrator.

Create and Embed an Application Manifest (UAC)

3

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

اخي الكريم B عشرة على عشرة , وجودك هنا مكسب للجميع , أشكرك على هذا الإبداع ,

الحل الأول نجح معي بعد تشغيل البرنامج كمدير , وهذا ما لا أحبه .

الحل الثاني شغال معاي وهو أفضل بكثير من الأول, ولكن هناك ملاحظة كالتالي :

لماأبد عملية النسخ أول شيء تظهر رسالة :

If any files have the same names, you will be asked if you want to replace those files.

Do you still want to merge this folder.

فإن إخترت Yes

تظهر رسالة ثانية يبدو أنها لتشغيل الدخول كمدير وعند الضغط على Continue تظهر الرسالة الموجودة في ردك للدخول كمدير

ثم يبدأ النسخ ولكن تظهر رسالة لكل مجلد يُنشأ في مجلد البرامج وهذا هو الشيء الذي أتمنى أن أجد حل لتلافيه, وأما الرسالة الأولى والثانية مقبولة بهذا الشكل .

وبالنسبة للبيئة التي أعمل عليها فهي NetBeans IDE 7.1.2 وقمت بإنشاء ملف manifest بالدفتر ثم أضفته لمشروعي ولكن الخطوات الأخرى لم أستطع عملها .

وأكرر لك شكري وإمتناني ,

تم تعديل بواسطه هدف الشمالي
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

لإلغاء كافة الرسائل إستبدل FOF_SILENT في هذا السطر:

shfileopstruct.fFlags   = FOF_SILENT;

بـ FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_NOCONFIRMMKDIR ليصبح:

shfileopstruct.fFlags	= FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_NOCONFIRMMKDIR;

ولن يظهر أي رسالة.

يلزمك الحصول على الأداة mt.exe وحسب الوثائق أنها تأتي مع حزمة Windows SDK. عني قمت مباشرة بتنصيب Visual studio ولا أستطيع مساعدتك بطريقة تنصيب تلك الحزمة.

عموماً إن حصلت عليها, ولديك ملف تنفيذي لنسميه app.exe. قم أولاً بتوليد ملف manifest من app.exe بالكتابة في سطر الأوامر :

C:\Users\Barakat\Desktop>mt -tlb:app.exe -dll:app.exe -out:app.manifest

Microsoft ® Manifest Tool version 5.2.3790.2014

Copyright © Microsoft Corporation 2005.

All rights reserved.

C:\Users\Barakat\Desktop>

ستجد أن هناك ملف جديد ظهر إسمه app.manifest ويحتوي مثل هذه الأسطر :

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"><file name="app.exe" hashalg="SHA1"></file></assembly>

ملف xml عادي, قم بتنسيقه ليصبح :

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<file name="app.exe" hashalg="SHA1"></file>
</assembly>

أضف عليه الأسطر التالية, الوسم trustInfo :

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<file name="app.exe" hashalg="SHA1"></file>

<trustInfo>
<security>
<requestedPrivileges>
<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>

</assembly>

الأن من سطر الأوامر إكتب :

C:\Users\Barakat\Desktop>mt -manifest app.manifest -outputresource:app.exe;1

Microsoft ® Manifest Tool version 5.2.3790.2014

Copyright © Microsoft Corporation 2005.

All rights reserved.

C:\Users\Barakat\Desktop>

وإنتهيبت الآن.

العمل مع الأداة من المفترض أن يكون آخر خطوة وقبل مرحلة النشر, لذا لاداعي للعجلة.

2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

+1

الله يحرم وجهك على النار , فعلًا أداة mt.exe حلت المشكلة جذريًا .

تم تعديل بواسطه هدف الشمالي
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .