C# 如何读取文件而不使AutoCAD崩溃?
我有一个存储在网络位置的文本文件。该文件在AutoCAD中用于某些用途。在某些情况下,会出现两个用户同时请求此文件,一个用户获得访问权限的问题,而第二个用户由于文件正被另一个用户使用而导致AutoCAD崩溃。为了防止出现这种情况,我们开始将文件复制到Appdata文件夹,并执行了此操作C# 如何读取文件而不使AutoCAD崩溃?,c#,autocad,C#,Autocad,我有一个存储在网络位置的文本文件。该文件在AutoCAD中用于某些用途。在某些情况下,会出现两个用户同时请求此文件,一个用户获得访问权限的问题,而第二个用户由于文件正被另一个用户使用而导致AutoCAD崩溃。为了防止出现这种情况,我们开始将文件复制到Appdata文件夹,并执行了此操作 internal string GetProjectLocation() { string strNetworkPath= "XXXX.com\Workdirs\Private\Projects.
internal string GetProjectLocation()
{
string strNetworkPath= "XXXX.com\Workdirs\Private\Projects.txt";
return GetValidPath(strNetworkPath);
}
private string GetValidPath(string strFullPath)
{
string strLocalPath = Environment.GetEnvironmentVariable("AppData") + @"\Acad-Data\";
string strFileName = Path.GetFileName(strFullPath);
if (!FileInUse(strFullPath))
{
return strFullPath;
}
string strLocalFilePath= strLocalPath + strFileName;
if (File.Exists(strLocalFilePath))
return strLocalFilePath;
return strFullPath;
}
internal bool FileInUse(string sFile)
{
bool rtnValue = false;
try
{
using (System.IO.FileStream f = new System.IO.FileStream(sFile, System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite, System.IO.FileShare.None))
{
rtnValue = false;
}
}
catch (System.Exception)
{
rtnValue = true;
}
return rtnValue;
}`
但即使这样做了,程序仍然会崩溃,并出现与以下相同的错误
System.IO.IOException:进程无法访问文件“\XXXX.com\Workdirs\Private\Projects.txt”,因为另一进程正在使用该文件
请注意,我已验证该文件是否存在于Appdata文件夹中。在执行此操作时,应如何防止AutoCAD崩溃 我不知道为什么应用程序在从appdata文件夹中的副本读取TXT文件时不断崩溃。您没有显示那段代码 我知道一种复制锁定文件的方法。如果您可以使用下面提供的方法更改该方法,则问题应该得到解决 尝试使用此扩展名方法首先获取锁定文件的副本。它应该为你提供一个可行的文件。它还将消除在应用程序开始时保留文件副本的需要 尽管我不建议在主机/客户机应用程序写入源文件时处理这样的文件。肯定会出问题。这就是他们发明数据库的原因;) 用法示例 扩展方法
内部静态类锁定文件
{
///
///制作已锁定以便在其他主机应用程序中使用的文件的副本。
///
///带文件路径的字符串。
公共静态字符串CopyLocked(此FileInfo源文件,字符串CopyStartGet=null)
{
如果(源文件为空)
抛出新ArgumentNullException(nameof(sourceFile));
如果(!sourceFile.Exists)
抛出新的InvalidOperationException($“参数{nameof(sourceFile)}:文件应该已经存在!”);
if(string.IsNullOrWhiteSpace(copyTartget))
CopyStartGet=Path.GetTempFileName();
使用(var inputFile=new FileStream)(sourceFile.FullName,FileMode.Open,
FileAccess.Read,FileShare.ReadWrite)
使用(var outputFile=newfilestream(copyrattget,FileMode.Create))
CopyTo(outputFile,0x10000);
返回copyrtartget;
}
}
我不知道为什么应用程序在从appdata文件夹中的副本读取TXT文件时不断崩溃。您没有显示那段代码
我知道一种复制锁定文件的方法。如果您可以使用下面提供的方法更改该方法,则问题应该得到解决
尝试使用此扩展名方法首先获取锁定文件的副本。它应该为你提供一个可行的文件。它还将消除在应用程序开始时保留文件副本的需要
尽管我不建议在主机/客户机应用程序写入源文件时处理这样的文件。肯定会出问题。这就是他们发明数据库的原因;)
用法示例
扩展方法
内部静态类锁定文件
{
///
///制作已锁定以便在其他主机应用程序中使用的文件的副本。
///
///带文件路径的字符串。
公共静态字符串CopyLocked(此FileInfo源文件,字符串CopyStartGet=null)
{
如果(源文件为空)
抛出新ArgumentNullException(nameof(sourceFile));
如果(!sourceFile.Exists)
抛出新的InvalidOperationException($“参数{nameof(sourceFile)}:文件应该已经存在!”);
if(string.IsNullOrWhiteSpace(copyTartget))
CopyStartGet=Path.GetTempFileName();
使用(var inputFile=new FileStream)(sourceFile.FullName,FileMode.Open,
FileAccess.Read,FileShare.ReadWrite)
使用(var outputFile=newfilestream(copyrattget,FileMode.Create))
CopyTo(outputFile,0x10000);
返回copyrtartget;
}
}
尝试读取流,而不仅仅是打开流。使用后在应用程序中创建一个新副本数据删除/now huours每次打开AutoCAD时,我都会在应用程序数据中创建文件副本。我也尝试读取流,但没有帮助,所以在粘贴代码时删除了该部分尝试读取流,不只是打开它。在应用程序中创建一个新副本使用后删除数据/now huours每次打开AutoCAD时,我都会在应用程序数据中创建文件副本。我还尝试读取流,但它没有帮助,所以我在粘贴代码时删除了该部分
private static void Main(string[] args)
{
try
{
// Locked autoCAD File
var lockedFile = @"C:\Users\username\Documents\test.dwg";
// Lets copy this locked file and read the contents
var unlockedCopy = new
FileInfo(lockedFile).GetCopy(@"C:\Users\username\Documents\test-copy.dwg");
// Open file with default app to show we can read the info.
Process.Start(unlockedCopy);
}
catch (Exception ex)
{
Trace.TraceError(ex.Message);
}
}
internal static class LockedFiles
{
/// <summary>
/// Makes a copy of a file that was locked for usage in an other host application.
/// </summary>
/// <returns> String with path to the file. </returns>
public static string CopyLocked(this FileInfo sourceFile, string copyTartget = null)
{
if (sourceFile is null)
throw new ArgumentNullException(nameof(sourceFile));
if (!sourceFile.Exists)
throw new InvalidOperationException($"Parameter {nameof(sourceFile)}: File should already exist!");
if (string.IsNullOrWhiteSpace(copyTartget))
copyTartget = Path.GetTempFileName();
using (var inputFile = new FileStream(sourceFile.FullName, FileMode.Open,
FileAccess.Read, FileShare.ReadWrite))
using (var outputFile = new FileStream(copyTartget, FileMode.Create))
inputFile.CopyTo(outputFile, 0x10000);
return copyTartget;
}
}