ให้เราเรียกรหัสตัวอย่างที่โพสต์ไว้ที่นี่ตัวเปลี่ยนเส้นทางและโปรแกรมอื่นที่เปลี่ยนเส้นทาง ถ้าเป็นฉันแล้วฉันอาจจะเขียนโปรแกรมเปลี่ยนเส้นทางการทดสอบที่สามารถใช้ในการทำซ้ำปัญหา
ดังนั้นฉันทำ สำหรับข้อมูลการทดสอบฉันใช้ ECMA-334 C # Language Specificationv PDF; ประมาณ 5MB ต่อไปนี้เป็นส่วนสำคัญของการที่
StreamReader stream = null;
try { stream = new StreamReader(Path); }
catch (Exception ex)
{
Console.Error.WriteLine("Input open error: " + ex.Message);
return;
}
Console.SetIn(stream);
int datasize = 0;
try
{
string record = Console.ReadLine();
while (record != null)
{
datasize += record.Length + 2;
record = Console.ReadLine();
Console.WriteLine(record);
}
}
catch (Exception ex)
{
Console.Error.WriteLine($"Error: {ex.Message}");
return;
}
ค่าชุดข้อมูลไม่ตรงกับขนาดไฟล์จริง แต่ไม่สำคัญ ไม่ชัดเจนว่าไฟล์ PDF ใช้ทั้ง CR และ LF ที่ท้ายบรรทัดเสมอ แต่ไม่สำคัญสำหรับเรื่องนี้ คุณสามารถใช้ไฟล์ข้อความขนาดใหญ่อื่น ๆ เพื่อทดสอบได้
การใช้รหัสตัวเปลี่ยนเส้นทางตัวอย่างแฮงค์เมื่อฉันเขียนข้อมูลจำนวนมาก แต่ไม่ใช่เมื่อฉันเขียนจำนวนเล็กน้อย
ฉันพยายามอย่างมากที่จะติดตามการดำเนินการของรหัสนั้นและฉันไม่สามารถทำได้ ฉันแสดงความคิดเห็นในบรรทัดของโปรแกรมที่ถูกเปลี่ยนเส้นทางซึ่งปิดการใช้งานการสร้างคอนโซลสำหรับโปรแกรมที่ถูกเปลี่ยนเส้นทางเพื่อพยายามหาหน้าต่างคอนโซลแยกต่างหาก แต่ฉันทำไม่ได้
แล้วฉันได้พบวิธีการเริ่มต้นแอปคอนโซลในหน้าต่างใหม่หน้าต่างของผู้ปกครองหรือไม่มีหน้าต่าง เห็นได้ชัดว่าเราไม่สามารถแยกคอนโซลได้อย่างง่ายดายเมื่อโปรแกรมคอนโซลหนึ่งเริ่มโปรแกรมคอนโซลอื่นโดยไม่มี ShellExecute และเนื่องจาก ShellExecute ไม่รองรับการเปลี่ยนเส้นทางเราต้องใช้คอนโซลร่วมกันแม้ว่าเราจะไม่ระบุหน้าต่างสำหรับกระบวนการอื่น
ฉันสันนิษฐานว่าหากโปรแกรมที่ถูกเปลี่ยนเส้นทางเติมบัฟเฟอร์ในที่ใดที่หนึ่งมันจะต้องรอข้อมูลที่จะอ่านและหาก ณ จุดนั้นไม่มีข้อมูลถูกอ่านโดยผู้เปลี่ยนเส้นทางแล้วมันจะเป็นการหยุดชะงัก
วิธีแก้ไขคือไม่ใช้ ReadToEnd และอ่านข้อมูลในขณะที่กำลังเขียนข้อมูล แต่ไม่จำเป็นต้องใช้การอ่านแบบอะซิงโครนัส การแก้ปัญหานั้นค่อนข้างง่าย งานต่อไปนี้สำหรับฉันด้วย PDF ขนาด 5 MB
ProcessStartInfo info = new ProcessStartInfo(TheProgram);
info.CreateNoWindow = true;
info.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
info.RedirectStandardOutput = true;
info.UseShellExecute = false;
Process p = Process.Start(info);
string record = p.StandardOutput.ReadLine();
while (record != null)
{
Console.WriteLine(record);
record = p.StandardOutput.ReadLine();
}
p.WaitForExit();
ความเป็นไปได้อีกอย่างคือการใช้โปรแกรม GUI เพื่อทำการเปลี่ยนเส้นทาง โค้ดก่อนหน้านี้ทำงานในแอ็พพลิเคชัน WPF ยกเว้นด้วยการแก้ไขที่ชัดเจน