如何在 .NET Core 2.1 中使用 Process.Start 使用默认程序打开网络共享驱动器上的文件
How to open a file on a network share drive with the default program using Process.Start in .NET Core 2.1
我有点困惑。我构建了一个 Intranet 应用程序,该应用程序具有允许用户将文件 "upload" 到网络共享驱动器的功能。这不是问题,因为我能够成功地将文件复制到指定的文件夹。
复制文件后的下一个要求是让用户单击附件的 link 并使用默认程序打开文件(即 Notepad.exe 用于 .txt 扩展名等)。
使用 Process.Start 我已经在我的本地主机上成功地演示了这一点,但是,当应用程序发布到主机服务器时会出现问题,因为它最初给出了 "Access is denied" 错误。在设置网络文件夹的权限以接受服务帐户并将应用程序池标识更改为该服务帐户后,它不再引发权限错误。事实上,它根本不会抛出错误。就像在本地主机上一样,它一直通过函数,但它没有打开文件,它显然什么都不做。
至少在我看来,应用程序 "thinks" 似乎已经打开了程序,因此继续前进,好像没有任何问题。我真的很茫然。我显然遗漏了一些东西,但我一辈子都弄不明白。
这是打开文件的函数:
ActivityLog activityLog = new ActivityLog();
FileInfo fileInfo = new FileInfo(filePath);
Process process = new Process();
try
{
if (fileInfo.Exists)
{
//I've used both UseShellExecute and the
//command line arguments with the same results.
/*
process.StartInfo = new ProcessStartInfo
{
FileName = fileInfo.FullName,
WorkingDirectory = fileInfo.DirectoryName,
UseShellExecute = true
};
*/
process.StartInfo = new ProcessStartInfo("cmd", $"/c start " + fileInfo.FullName.FileStringToUri());
process.Start();
}
else throw new Exception("FileInfo not found | File Path: " + filePath);
}
catch (Exception e)
{
if (fileInfo.Exists)
activityLog.LogErrorAsync(new Exception("File Path: " + fileInfo.FullName + " | " + e.Message, e));
else
activityLog.LogErrorAsync(e);
throw e;
}
FileStringToUri()
是一个自定义扩展,本质上创建一个类似于 file://{file}/{path}
的 uri 字符串,但如果使用 UseShellExecute
方法则不需要此扩展。
关闭工单。照原样在评论中回答。谢谢@damien-the-unbeliever
我有点困惑。我构建了一个 Intranet 应用程序,该应用程序具有允许用户将文件 "upload" 到网络共享驱动器的功能。这不是问题,因为我能够成功地将文件复制到指定的文件夹。 复制文件后的下一个要求是让用户单击附件的 link 并使用默认程序打开文件(即 Notepad.exe 用于 .txt 扩展名等)。 使用 Process.Start 我已经在我的本地主机上成功地演示了这一点,但是,当应用程序发布到主机服务器时会出现问题,因为它最初给出了 "Access is denied" 错误。在设置网络文件夹的权限以接受服务帐户并将应用程序池标识更改为该服务帐户后,它不再引发权限错误。事实上,它根本不会抛出错误。就像在本地主机上一样,它一直通过函数,但它没有打开文件,它显然什么都不做。 至少在我看来,应用程序 "thinks" 似乎已经打开了程序,因此继续前进,好像没有任何问题。我真的很茫然。我显然遗漏了一些东西,但我一辈子都弄不明白。
这是打开文件的函数:
ActivityLog activityLog = new ActivityLog();
FileInfo fileInfo = new FileInfo(filePath);
Process process = new Process();
try
{
if (fileInfo.Exists)
{
//I've used both UseShellExecute and the
//command line arguments with the same results.
/*
process.StartInfo = new ProcessStartInfo
{
FileName = fileInfo.FullName,
WorkingDirectory = fileInfo.DirectoryName,
UseShellExecute = true
};
*/
process.StartInfo = new ProcessStartInfo("cmd", $"/c start " + fileInfo.FullName.FileStringToUri());
process.Start();
}
else throw new Exception("FileInfo not found | File Path: " + filePath);
}
catch (Exception e)
{
if (fileInfo.Exists)
activityLog.LogErrorAsync(new Exception("File Path: " + fileInfo.FullName + " | " + e.Message, e));
else
activityLog.LogErrorAsync(e);
throw e;
}
FileStringToUri()
是一个自定义扩展,本质上创建一个类似于 file://{file}/{path}
的 uri 字符串,但如果使用 UseShellExecute
方法则不需要此扩展。
关闭工单。照原样在评论中回答。谢谢@damien-the-unbeliever