我创建了一个简单的程序来删除C#中的临时文件(为了好玩,而不是一个主要项目),并且遇到锁定文件(使用中)问题.你通常如何排除这些文件?作为参考,我收到错误:
该进程无法访问文件'ExchangePerflog_8484fa31c65c7a31cfcccd43.dat',因为它正由另一个进程使用.
码:
static void Main(string[] args)
{
string folderPath = string.Empty;
folderPath = System.Environment.GetEnvironmentVariable("temp");
deleteFilesInDirectory(folderPath);
}
public static void deleteFilesInDirectory(string folderPath)
{
try
{
var dir = new DirectoryInfo(folderPath);
dir.Attributes = dir.Attributes & ~FileAttributes.ReadOnly;
dir.Delete(true);
MessageBox.Show(folderPath + " has been cleaned.");
}
catch (System.IO.IOException ex)
{
MessageBox.Show(ex.Message);
return;
}
}
Run Code Online (Sandbox Code Playgroud) 我的控制台应用程序正在创建一些运行时文件,所以我想要做的是在应用程序启动时删除所有这些文件.我试过这个:
public static void Empty(string targetDir)
{
var directory = new DirectoryInfo(targetDir);
if (!directory.Exists) return;
foreach (var file in directory.GetFiles()) file.Delete();
foreach (var subDirectory in directory.GetDirectories()) subDirectory.Delete(true);
}
Run Code Online (Sandbox Code Playgroud)
...只是为了查找给定路径中的所有文件/文件夹(位于程序执行路径的子目录中),然后删除它们.但是,我得到以下异常:
访问路径"文件"被拒绝.
我试图以管理员身份运行该程序而没有运气; 但是,我想要一个不使用管理员权限的解决方案.
备注:
我正在尝试将 WebView2 DLL 嵌入到 C# 项目中。我添加了 3 个 DLL:
Microsoft.Web.WebView2.Wpf.dll
Microsoft.Web.WebView2.Core.dll
WebView2Loader.dll
Run Code Online (Sandbox Code Playgroud)
作为我的项目的嵌入式资源。由于它是一个 WPF 项目,我不需要 Microsoft.Web.WebView2.Forms.dll。
我已经正确合并了 Newtonsoft.Json.dll。
在调试模式下,没有问题,因为所有DLL都被复制到输出目录。
因为我希望可执行文件是可移植的,所以我只需要一个文件(我知道用 exe 复制 DLL 是可行的,但我需要一个文件)。当我仅将主可执行文件移动到另一个文件夹时,当我使用 webview2 控件时应用程序崩溃(该控件在启动时未加载)。
我试图弄清楚是否所有的 DLL 都参与其中。Microsoft.Web.WebView2.Wpf.dll 已正确嵌入,我不需要在目标文件夹中使用它。
然而,最后两个仍然是必需的。我认为这可能是因为它们是由 Microsoft.Web.WebView2.Wpf.dll 调用的,而不是由主程序集调用的。
如何从主程序集中加载最后两个文件以获得单个执行文件?
编辑:所有 DLL 都作为嵌入式资源添加到项目中
感谢@mm8给我部分想法(欢迎任何完整解决方案的建议)实现这一目标。
因此,可以通过添加 3 个 WebView2 DLL 并将它们设置为嵌入资源来将它们嵌入到您的项目中。Microsoft.Web.WebView2.Wpf.dll(或者Microsoft.Web.WebView2.WinForms.dll,取决于您的选择)可以直接加载到内存中。但最后两个(Microsoft.Web.WebView2.Core.dll和WebView2Loader.dll)需要保存为文件:
public MainWindow()
{
// For Newtonsoft.Json.dll, Microsoft.Web.WebView2.Wpf.dll, Microsoft.Web.WebView2.Core.dll and WebView2Loader.dll
// Incorporation as embedded resource
// To avoid having multiple files, only one executable
AppDomain.CurrentDomain.AssemblyResolve += GetEmbeddedDll; …Run Code Online (Sandbox Code Playgroud) 我的应用程序需要删除一些文件,但这应该发生,直到下一次启动Windows.
我现在正在做的是在RunOnce注册表项中写入此字符串值:
Command.com /c del c:\some file.ext
Run Code Online (Sandbox Code Playgroud)
但我发现嵌入空间的路径存在问题.我不得不说我也试过这个:
Command.com /c del "c:\some file.ext"
Run Code Online (Sandbox Code Playgroud)
但这并不能解决问题,但最糟糕的是:不管删除任何文件,无论嵌入空间如何!
从我的程序中删除文件延迟到下次重启的正确方法是什么?
谢谢.
我正在创建一个删除子目录/文件的命令行实用程序.如果正在使用文件,System.IO.IOException则抛出该文件.我在for循环中使用了try-catch块.
题:
1.在for循环中有一个try-catch是不好的做法吗?
2.如果是,什么是更好的选择?
我的代码:
System.IO.DirectoryInfo di = new DirectoryInfo(path);
foreach (FileInfo file in di.GetFiles())
{
try
{
file.Delete();
}
catch(System.IO.IOException)
{
Console.WriteLine("Please Close the following File {0}", file.Name);
}
}
Run Code Online (Sandbox Code Playgroud) 当逐个删除文件时,会生成错误,因为"进程无法访问文件",因为在尝试删除文件时,其他进程正在使用该文件
代码:有关删除文件的任何建议吗?
private void DeleteFilesFromDestination()
{
string consolidatedFolder = System.Configuration.ConfigurationManager.AppSettings["path"].ToString();
foreach (String file in ListBoxDeleteFiles.Items)
{
try
{
// delete each selected files from the specified TargetFolder
if (System.IO.File.Exists(consolidatedFolder + @"\" + System.IO.Path.GetFileName(file)))
{
proc.WaitForExit();
System.IO.File.Delete(consolidatedFolder + @"\" + System.IO.Path.GetFileName(file));
}
}
catch (Exception ex)
{
MessageBox.Show("Error Could not Delete file from disk " + ex.Message, "Shipment Instruction",
MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
}
Run Code Online (Sandbox Code Playgroud)
注意:图像将被加载到这样的flowlayout面板
//Open the files to see
private void ListBoxSourceFiles_Click(object sender, EventArgs e)
{
try
{
if …Run Code Online (Sandbox Code Playgroud)