C#打印目录PDF后移动失败,仅注释移动代码可正常打印如何解决?
问题根因
你代码里的打印逻辑是通过Process.Start()启动系统关联的PDF打印程序,这个方法是异步执行的,调用后会立刻返回而不会等待打印任务完成。你第一个循环刚触发完所有打印进程,第二个循环就立刻把源文件复制删除了,此时打印程序还没完成PDF文件的读取操作,自然会打印失败。
解决方案
1. 核心修复逻辑
在启动打印进程后调用WaitForExit()方法,等待打印程序运行结束后再执行文件移动操作,同时建议把打印和移动逻辑合并到同一个循环中,避免重复遍历目录。
2. 修正后的代码示例
//Print & Move the files after printing DirectoryInfo sourceinfo = new DirectoryInfo(@"C:\fold"); DirectoryInfo target = new DirectoryInfo(@"C:\fold1"); if (!Directory.Exists(target.FullName)) { Directory.CreateDirectory(target.FullName); } foreach (FileInfo fi in sourceinfo.GetFiles()) { if (fi.Length != 0) { using (System.Diagnostics.Process process = new System.Diagnostics.Process()) { process.StartInfo.CreateNoWindow = true; process.StartInfo.Verb = "print"; process.StartInfo.FileName = fi.FullName; process.StartInfo.UseShellExecute = true; process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; process.Start(); // 等待打印进程退出,可按需添加超时时间,比如WaitForExit(30000)代表最多等30秒,避免进程卡死导致程序挂起 process.WaitForExit(); } // 打印完成后直接移动文件,无需二次遍历 fi.CopyTo(Path.Combine(target.FullName, fi.Name), true); fi.Delete(); } }
额外注意事项
- 部分默认PDF阅读器(比如Adobe Acrobat)打印完成后可能不会主动退出进程,会导致
WaitForExit()一直卡住。这种情况建议指定用支持命令行打印、打印后自动退出的轻量PDF工具执行打印,稳定性更高。 - 你原代码第二个循环里用到的变量
c没有定义,需要根据你的实际业务逻辑修正判断条件。
内容的提问来源于stack exchange,提问作者Ramadan Abdinour
相关产品推荐
相关产品推荐

