سؤال

أنا حاليا أكتب لنفسي قليلا C# احتياطية من البرنامج.أنا باستخدام ويندوز القياسية شكل واجهة اتصل cmd.exe كما عملية جديدة ، ومن ثم استخدام XCOPY من داخل هذه العملية الجديدة.كل شيء هو عمل عظيم ، باستثناء هذه الميزة الأخيرة أريد أن أضيف في القدرة على كسر العملية.

من مواليد موجه الأوامر, أستطيع أن أفعل ذلك نظيفة مع ctrl+c ، لكن سأحاول, لا أستطيع تكرار هذه الوظيفة باستخدام winforms و نهج العملية.لقد حاولت إعادة توجيه standardinput واستخدام أن إرسال consolespecialkeys.ControlC إلى هذه العملية ، كما حاولت إرسال 0x03 و "/03 x", وكلاهما قرأت في منتدى آخر المشاركات رمز عرافة على ctrl+c.لا شيء أنا أرسل مسجلة على الرغم من الخروج من العملية يقتل واجهة المستخدم ، ولكنه يترك xcopy.exe العمل في الخلفية.قتل xcopy.exe يدويا النتائج في ترك الملف كان النسخ نصف نسخ تالفة ، لا شيء يحدث باستخدام ctrl+c في موجه الأوامر.

أنا في عداد المفقودين شيء تمام الوضوح واضح ؟ أنا جديدة العش إلى C#, لذا سأمسك يدي و أعترف أن هذا هو الأرجح كوني بطيئة ، أو سوء فهم كيفية العملية مع cmd.exe.ومع ذلك ، منذ عمليات دعم المدخلات القياسية توجيه يبدو وكأنه شيء يجب أن تعمل...بالنسبة لي على الأقل.لقد وضع المخطط الأساسي من قانون بلدي أدناه ، في حالة أنه يساعد على تحديد أين أنا لخبطة.

string XCopyArguments = "\"" + dir.FullName + "\" \"" + destination + "\" /D /S /I /E";  
Process XCopyProcess = new Process();  
ProcessStartInfo XCopyStartInfo = new ProcessStartInfo(); 
XCopyStartInfo.FileName = "CMD.exe ";  
XCopyStartInfo.RedirectStandardError = true;
XCopyStartInfo.RedirectStandardOutput = true;
XCopyStartInfo.RedirectStandardInput = true;
XCopyStartInfo.UseShellExecute = false;
XCopyStartInfo.CreateNoWindow = true;
XCopyStartInfo.Arguments = " /D /c XCOPY " + XCopyArguments;
XCopyProcess.EnableRaisingEvents = true;
XCopyProcess.StartInfo = XCopyStartInfo;
XCopyProcess.Start();                
XCopyProcess.WaitForExit(15000);
int ExitCode = XCopyProcess.ExitCode;
if (ExitCode > 0 & !XCopyProcess.HasExited)
{
XCopyProcess.Kill();
}
XCopyProcess.Dispose();

شكرا جزيلا مقدما على أي مساعدة أي شخص يمكن أن تقدم.

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

المحلول

وأنا لا أريد أن أكون besserwisser، ولكن أعتقد أنك سوف تكون أفضل بكثير من القيام النسخ داخل البرنامج. باستخدام ملف، دليل والفئات الأخرى في مساحة الاسم System.IO، انها بسيطة حقا، ويترك لك في السيطرة الكاملة الإبلاغ عن التقدم المحرز، إلغاء عمليات الخ.

نصائح أخرى

نعم, تقوم العملية .صافي سيكون أسهل.ولكن أنا في حاجة الى ارسال ctrl-c إلى عملية أيضا وأنا لم يكن لديك هذا الخيار.

هل يمكننا الحصول على إجابة هذا السؤال ؟

تحرير: هل يجب أن آخر نسخة مكررة للحصول على إجابة ؟ و لا @j0rd4n لم تجب على السؤال.

وقال مثل الآخرين، وهناك طرق أفضل لإنجاز هذه المهمة معينة. ومع ذلك، هذا لا يجيب على سؤالك. يمكنني استخدام تقنية مماثلة إلى ما كنت قد تظهر هنا لأتمتة المهام المختلفة وتجد أنه من المفيد جدا. في بعض الأحيان تسير الأمور بشكل سيء للغاية على الرغم من وتريد العملية لإنقاذ قبل أن تزداد الأمور سوءا. ؛ ف

وهنا المشكلة مع المثال الخاص بك:

وXCopyStartInfo.CreateNoWindow = صحيح؛

وتعيينها إلى false، وسوف ثم معالجة XCopyProcess.CloseMainWindow () وXCopyProcess.Close (). أنظف بكثير من استخدام قتل ().

وسيكون تتطلب عددا أقل من خطوط الرمز إلى حلقة فقط على الدلائل والملفات ونسخها واحدا تلو الآخر ثم كنت لا داعي للقلق حول السيطرة عملية أخرى ...

واسف انها في VB.NET.

Declare Function GenerateConsoleCtrlEvent Lib "kernel32" ( _
                    ByVal dwCtrlEvent As Integer, _
                    ByVal dwProcessGroupId As Integer _
                    ) As Integer

Private Const CTRL_C_EVENT As Integer = 0

Private Sub SendCtrlC()
    GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0)

    ' send a Ctrl-C to this process
    GenerateConsoleCtrlEvent(CTRL_C_EVENT, currentpid)

    ' send a Ctrl-C to the cmd process
    GenerateConsoleCtrlEvent(CTRL_C_EVENT, cmdpid)
End Sub

ولقد أرسلت بنجاح مجموعة CTRL-C لعملية CMD.EXE تم إنشاؤها باستخدام SW_HIDE - أي بمعنى، نافذة CMD.EXE مخفي

وكانت هذه التقنية على استخدام EnumWindows لتحديد عملية وسهولة الحصول عليها من التعامل مع نافذة (لا يزال لديه مؤشر إلى معالجة الرسائل حتى لو كان غير مرئي).

وبعد ذلك، كنت PostMessage للنشر مجموعة السيطرة ج لهذه العملية. كان هذا نفس التأثير كما لو أن المستخدم قد ضرب "CTRL-ج" في حين كان الإطار النشط.

لذلك من C #، هل تريد على الارجح لزيارة http://pinvoke.net/ - المنقذ عندما يتعلق الأمر كتابة Win32 ونماذج وظيفة API في C #.

يجب أن يدويا قتل العملية إذا كنت ترغب في التعامل مع نسخ من هذا الطريق.في التعليمات البرمجية أعلاه, كنت تتصل XCopyProcess.WaitForExit(...).هذا هو حجب المكالمات حتى الوالد C# العملية سوف توقف عند هذه النقطة حتى الطفل انتهت العملية أو الوقت الفاصل قد انقضت.

ما يمكن أن تفعله بدلا من عرقلة يمكنك النوم في حلقة بشكل روتيني التحقق إذا كان المستخدم قد طلب من قتل العملية عن طريق C# واجهة المستخدم.إذا كنت تتلقى هذا الحدث ، صراحة قتل العملية.وإلا كنت انتظر فاصل آخر حتى يتم الانتهاء من عملية.

تحرير: أنا لا أتفق مع تعليقات أخرى ، على الرغم من.نسخ مباشرة من .NET framework بدلا من استخدام xcopy.

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