C# 如何读取文件而不使AutoCAD崩溃?

C# 如何读取文件而不使AutoCAD崩溃?,c#,autocad,C#,Autocad,我有一个存储在网络位置的文本文件。该文件在AutoCAD中用于某些用途。在某些情况下,会出现两个用户同时请求此文件,一个用户获得访问权限的问题,而第二个用户由于文件正被另一个用户使用而导致AutoCAD崩溃。为了防止出现这种情况,我们开始将文件复制到Appdata文件夹,并执行了此操作 internal string GetProjectLocation() { string strNetworkPath= "XXXX.com\Workdirs\Private\Projects.

我有一个存储在网络位置的文本文件。该文件在AutoCAD中用于某些用途。在某些情况下,会出现两个用户同时请求此文件,一个用户获得访问权限的问题,而第二个用户由于文件正被另一个用户使用而导致AutoCAD崩溃。为了防止出现这种情况,我们开始将文件复制到Appdata文件夹,并执行了此操作

  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;
    }
}