这是方法:
private void Compressions(string zipFile,string sources)
{
try
{
string zipFileName = zipFile;
string source = sources;
string output = @"c:\temp";
string programFilesX86 = System.Environment.GetFolderPath(System.Environment.SpecialFolder.ProgramFilesX86) + "\\Diagnostic Tool\\7z.dll";
if (File.Exists(programFilesX86))
{
SevenZipExtractor.SetLibraryPath(programFilesX86);
}
else
{
string path = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) + "\\7z.dll";
SevenZipExtractor.SetLibraryPath(path);
}
string programFiles = System.Environment.GetFolderPath(System.Environment.SpecialFolder.ProgramFiles) + "\\Diagnostic Tool\\7z.dll";
if (File.Exists(programFiles))
{
SevenZipExtractor.SetLibraryPath(programFiles);
}
else
{
if (File.Exists(programFilesX86))
{
SevenZipExtractor.SetLibraryPath(programFilesX86);
}
else
{
string path = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) + "\\7z.dll";
SevenZipExtractor.SetLibraryPath(path);
}
}
SevenZipCompressor compressor = new SevenZipCompressor();
compressor.ArchiveFormat = …Run Code Online (Sandbox Code Playgroud) 我在项目中引用了dll文件: SevenZipSharp.dll
然后在Form1的顶部我添加:
using SevenZip;
Run Code Online (Sandbox Code Playgroud)
然后我创建了一个我通过按钮单击事件调用的函数:
private void Compress()
{
string source = @"C:\Users\bout0_000\AppData\Local\Diagnostic_Tool_Blue_Screen\Diagnostic Tool Blue Screen\SF_02-08-13";
string output = @"D:\Zipped.zip";
SevenZipCompressor compressor = new SevenZipCompressor();
compressor.ArchiveFormat = OutArchiveFormat.Zip;
compressor.CompressionMode = CompressionMode.Create;
compressor.TempFolderPath = System.IO.Path.GetTempPath();
compressor.CompressDirectory(source, output);
}
Run Code Online (Sandbox Code Playgroud)
我使用了一个断点,错误就行了:
compressor.CompressDirectory(source, output);
Run Code Online (Sandbox Code Playgroud)
但我收到一个错误:
无法加载7-zip库或内部COM错误!消息:DLL文件不存在
但是我已经引用了dll,为什么会出现这个错误呢?我该如何解决?
解决了这个问题:
private void Compress()
{
string source = @"C:\Users\bout0_000\AppData\Local\Diagnostic_Tool_Blue_Screen\Diagnostic Tool Blue Screen\SF_02-08-13";
string output = @"D:\Zipped.zip";
SevenZipExtractor.SetLibraryPath(@"C:\Program Files\7-Zip\7z.dll");
SevenZipCompressor compressor = new SevenZipCompressor();
compressor.ArchiveFormat = OutArchiveFormat.Zip;
compressor.CompressionMode = CompressionMode.Create;
compressor.TempFolderPath = System.IO.Path.GetTempPath();
compressor.CompressDirectory(source, output);
}
Run Code Online (Sandbox Code Playgroud) 在Form1的顶部,我做了:
private Process zipFileDirectoryProcess;
Run Code Online (Sandbox Code Playgroud)
在构造函数中我做了:
zipFileDirectoryProcess = new Process();
zipFileDirectoryProcess.StartInfo.FileName = "explorer.exe";
zipFileDirectoryProcess.StartInfo.CreateNoWindow = true;
zipFileDirectoryProcess.EnableRaisingEvents = true;
zipFileDirectoryProcess.Exited += new EventHandler(zipFileDirectoryProcess_Exited);
Run Code Online (Sandbox Code Playgroud)
然后我有一个方法,我从一个按钮点击事件调用它:
private void Compress()
{
zipFileDirectoryProcess.StartInfo.Arguments = zipFileDirectoryProcess.StartInfo.Arguments = "/select," + Path.GetFullPath(t);
zipFileDirectoryProcess.Start();
zipFileDirectoryProcess.WaitForExit();
this.TopMost = true;
}
Run Code Online (Sandbox Code Playgroud)
然后在底部退出事件:
private void zipFileDirectoryProcess_Exited(object sender, EventArgs e)
{
this.BeginInvoke(new MethodInvoker(delegate()
{
this.TopMost = false;
}));
}
Run Code Online (Sandbox Code Playgroud)
我想要做的只是当我在方法中启动它之后关闭进程窗口时才关闭窗口/进程然后执行Exited事件.
问题是,一旦过程在2-3秒后开始,它就会自动跳转到退出事件.
我该如何解决?尝试过的例子无法弄清楚.试图添加这一行:
zipFileDirectoryProcess.WaitForExit();
Run Code Online (Sandbox Code Playgroud)
但没有效果.
我在Form1中有此按钮单击代码:
private void DriverVerifier_Click(object sender, EventArgs e)
{
if (MessageBox.Show("Are you Sure you want to Launch the Driver Verifier. Click Yes to Confirm and No to continue", "WinForm", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
{
}
else
{
ProcessRun.Processing(Environment.SystemDirectory, "verifier.exe", "", false, "");
}
}
Run Code Online (Sandbox Code Playgroud)
这将运行Windows 7和8及其他版本附带的驱动程序验证程序管理器程序。
当某些驱动程序验证程序管理器在Form后面运行并且您无法将其带到前面时,对于某些用户而言,问题出在某些Windows版本中。
我的问题是,是否有任何办法可以迫使这一进程摆在最前面?
这是我的类ProcessRun的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
using System.IO;
namespace Diagnostic_Tool_Blue_Screen
{
static class ProcessRun
{
public static void Processing(string WorkingDirectory, string FileName, string Arguments, bool StandardOutput, …Run Code Online (Sandbox Code Playgroud) 我的代码中有这一行:
if (address.EndsWith("GIF") || (address.EndsWith("BMP") || address.EndsWith("JPEG") || address.EndsWith("TIFF") || address.EndsWith("RAW") || address.EndsWith("PNG")))
Run Code Online (Sandbox Code Playgroud)
例如,现在地址变量中的网址是:www.test.jpg然后它永远不会进入IF并跳出/继续.
我希望它在所有扩展名为大写和小写的例如"GIF"和"gif"我该怎么做?
(子问题如果我想检查文件扩展名做EndsWith("gif"就足够了,或者我必须在它之前添加一个点,如".gif"或像".jpeg"?)
我在Form1的顶部添加了这两行:
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.WorkerSupportsCancellation = true;
Run Code Online (Sandbox Code Playgroud)
在按钮点击事件开始我添加:
timer2.Enabled = true;
if (this.backgroundWorker1.IsBusy == false)
{
this.backgroundWorker1.RunWorkerAsync();
}
Run Code Online (Sandbox Code Playgroud)
这是DoWork事件:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
if (worker.CancellationPending)
{
e.Cancel = true;
return;
}
if (filesContent.Length > 0)
{
for (int i = 0; i < filesContent.Length; i++)
{
File.Copy(filesContent[i], Path.Combine(contentDirectory, Path.GetFileName(filesContent[i])), true);
}
}
WindowsUpdate();
CreateDriversList();
GetHostsFile();
Processes();
}
Run Code Online (Sandbox Code Playgroud)
然后工作完成了事件:
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if ((e.Cancelled == true))
{
this.Diagnose.Text …Run Code Online (Sandbox Code Playgroud) 我有一个启动操作的按钮单击事件:
private void Diagnose_Click(object sender, EventArgs e)
{
processfinish = false;
timer2.Enabled = true;
timerCount = 0;
count = 0;
countBack = 5;
CreateZip.Enabled = false;
DriverVerifier.Enabled = false;
Diagnose.Enabled = false;
Diagnose.Text = "PROCESSING PLEASE WAIT";
if (this.backgroundWorker1.IsBusy == false)
{
this.backgroundWorker1.RunWorkerAsync();
}
Logger.Write("***** OPERATION STARTED *****");
}
Run Code Online (Sandbox Code Playgroud)
并完成了背景工作者的活动:
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
processfinish = true;
Logger.Write("***** OPERATION ENDED *****");
}
Run Code Online (Sandbox Code Playgroud)
并且timer1 tick事件在到达已完成的事件时开始工作:
private void timer1_Tick(object sender, EventArgs e)
{
count++;
Diagnose.Text = "PROCESS HAS FINISHED" …Run Code Online (Sandbox Code Playgroud) 我有这个用于创建ZIP文件的代码:
void Compress(string contentDirectory, string zippedFileDirectory)
{
… // locate 7z.dll and invoke SevenZipExtractor.SetLibraryPath
SevenZipCompressor compressor = new SevenZipCompressor()
{
ArchiveFormat = OutArchiveFormat.Zip,
CompressionMode = CompressionMode.Create,
TempFolderPath = Path.GetTempPath()
};
string source = contentDirectory;
string output = zippedFileDirectory;
string zipFileName = "Diagnosis_Files.zip";
string t = Path.Combine(output, zipFileName);
compressor.CompressDirectory(source, t);
}
Run Code Online (Sandbox Code Playgroud)
在compressor.CompressDirectory完成创建ZIP文件之后,我想向用户显示ZIP文件,以便他们可以轻松地复制它或只看到它在哪个目录中创建.
我怎样才能做到这一点?
我有这个代码:
string log_file_name = @"\logger.txt";
string logger_file_to_read = Path.GetDirectoryName(Application.LocalUserAppDataPath) + @"\log";
string LoggerFile = Path.Combine(logger_file_to_read, log_file_name);
Run Code Online (Sandbox Code Playgroud)
我使用断点,我看到:logger_file_to_read包含:
C:\ Users\bout0_000\AppData\Local\Diagnostic_Tool_Blue_Screen\Diagnostic Tool Blue Screen\log
而log_file_name包含:
\ logger.txt
但后来我发现LoggerFile只包含文件名:\ logger.txt没有目录.
这是什么?
string[] s = Directory.GetFiles(t, "*.txt",SearchOption.AllDirectories);
for (int i = 0; i < s.Length; i++)
{
File.Copy(s[i],
}
Run Code Online (Sandbox Code Playgroud)
File.Copy会将文件复制到另一个文件名.我想保留相同的文件名只是将它们从一个目录复制到另一个目录.