Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >dotnet 启动进程传入不存在的文件夹作为工作目录行为变更

dotnet 启动进程传入不存在的文件夹作为工作目录行为变更

作者头像
林德熙
发布于 2022-03-15 07:47:35
发布于 2022-03-15 07:47:35
94000
代码可运行
举报
文章被收录于专栏:林德熙的博客林德熙的博客
运行总次数:0
代码可运行

本文记录在 dotnet 下,启动进程,传入不存在的文件夹作为进程的工作目录,分别在 .NET Framework 和 .NET Core 的行为

在 dotnet 6 下,可以使用 ProcessStartInfo 辅助创建 Process 进程,如以下代码进行测试,传入不存在的 Z:\Windows 文件夹

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Console.WriteLine($"Fx {Environment.CurrentDirectory}");

if (args.Length > 0)
{
    return;
}

var location = Assembly.GetExecutingAssembly().Location;
var fileName = Path.GetFileNameWithoutExtension(location);
var directory = Path.GetDirectoryName(location);

var exe = Path.Combine(directory, fileName + ".exe");
var processStartInfo = new ProcessStartInfo(exe,"fx")
{
    WorkingDirectory = "Z:\\Windows"
};
var process = Process.Start(processStartInfo);

运行将会在 Process.Start 方法上抛出 System.ComponentModel.Win32Exception 说 目录名称无效

如果是在英文环境下,将会提示 The directory name is invalid 从而失败

但如果没有设置 ProcessStartInfo 的 WorkingDirectory 工作路径,那么默认将使用当前进程的 Environment.CurrentDirectory 值作为启动进程的工作路径

在 .NET Core 和 .NET Framework 下,启动时,设置 UseShellExecute 分别为 true 和 false 的值,行为有所不同。在不设置 ProcessStartInfo 的 WorkingDirectory 工作路径,让新的进程默认使用 Environment.CurrentDirectory 工作文件夹。但是此工作路径是一个被插拔的 U 盘的路径,如以下代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
            Environment.CurrentDirectory = @"I:\";

            var exe = Path.Combine(directory, fileName + ".exe"); // 执行到这句代码的时候,拔出 U 盘,让 I:\ 不存在
            var processStartInfo = new ProcessStartInfo(exe, "fx")
            {
                UseShellExecute = true, // 也设置为 false 的值
            };
            var process = Process.Start(processStartInfo);
            process.WaitForExit();

我使用 .NET 6 和 .NET Framework 4.5 进行分别的测试,测试如下:

在 .NET Core 下,设置 UseShellExecute=false 的值,运行结果是:成功,新进程工作路径等于 I:\ 路径

在 .NET Core 下,设置 UseShellExecute=true 的值,运行结果是:成功,新进程工作路径等于 C:\Windows 路径

在 .NET Framework 下,设置 UseShellExecute=false 的值,运行结果是:运行 Process.Start 失败,提示 System.ComponentModel.Win32Exception: '目录名称无效。' 错误

在 .NET Framework 下,设置 UseShellExecute=true 的值,运行结果是:成功,新进程工作路径等于 C:\Windows 路径

更多请看 c# - Win32Exception: The directory name is invalid - Stack Overflow

CreateProcess and ShellExecute differences - Stack Overflow

本文所有代码放在githubgitee 欢迎访问

可以通过如下方式获取本文的源代码,先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin f7696a3e9f33dfcbfdd8ab92afaa77ab668dfeb9

以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git

获取代码之后,进入 HebarlawkuKekebuwagay 文件夹

本文会经常更新,请阅读原文: https://blog.lindexi.com/post/dotnet-%E5%90%AF%E5%8A%A8%E8%BF%9B%E7%A8%8B%E4%BC%A0%E5%85%A5%E4%B8%8D%E5%AD%98%E5%9C%A8%E7%9A%84%E6%96%87%E4%BB%B6%E5%A4%B9%E4%BD%9C%E4%B8%BA%E5%B7%A5%E4%BD%9C%E7%9B%AE%E5%BD%95%E8%A1%8C%E4%B8%BA%E5%8F%98%E6%9B%B4.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
dotnet 测试在 UOS Linux 上使用 Process Start 打开文件的行为
本文记录我在 UOS Linux 系统上使用 Process.Start 打开文件的行为
林德熙
2024/01/25
3040
WPF 简单实现一个支持删除自身的应用
我准备写一个逗比的应用,然而我担心被小伙伴看到这个应用的文件从而知道是我写的,于是我就需要实现让应用能自删除的功能。核心实现方法就是调用 cmd 传入命令行,等待几秒之后删除文件
林德熙
2021/10/25
4020
dotnet 使用 NamedPipeClientStream 连接一个不存在管道服务名将不断空跑 CPU 资源
本文记录一个开发和代码审查过程中,需要关注的细节。在 dotnet 里,在 .NET 6 和以下版本,包括 .NET Framework 版本,使用 NamedPipeClientStream 进行连接管道服务,如果此时的管道服务没有存在,或者还没有启动,调用 ConnectAsync 或 Connect 方法,将会进入一个循环,不断进行空跑,等待超时或者是连接上。默认的 ConnectAsync 或 Connect 方法,传入的超时时间都是无穷,也就是将会无限重试,不断消耗 CPU 资源
林德熙
2022/03/15
1.2K0
PublishFolderCleaner 让你的 dotnet 应用发布文件夹更加整洁
大家都知道,在 dotnet 发布时,将会在输出的 publish 文件夹包含所需的依赖。在 .NET Core 开始,引入了 AppHost 的概念,即使是单个程序集,也需要独立的 Exe 可执行文件带上实际包含 Main 函数的 dll 文件。特别是进行独立发布的时候,输出文件夹上有超级多个文件,看起来不清真。本文来告诉大家如何使用 PublishFolderCleaner 工具让发布文件夹只留一个 Exe 和一个 Lib 文件夹
林德熙
2021/10/20
9570
dotnet 6 使用 CreateSymbolicLink 创建文件夹符号链接
本文告诉大家如何使用 dotnet 6 提供的 Directory.CreateSymbolicLink 和 File.CreateSymbolicLink 方法创建文件夹和文件的符号链接
林德熙
2021/11/10
1K0
C#学习笔记——启动其他进程
1 启动一个独立进程,需要用到的命名空间是:using System.Diagnostics; 进程类是 Process ,进程的相关参数信息类是 ProcessStartInfo
vv彭
2021/06/10
9020
dotnet core 在 MAC 系统下删除应用程序自己后调 Process Start 方法将会抛出 Win32 异常
在 MAC 系统下,如果在运行过程中,应用程序的文件被删除了,那么此时如果应用程序执行了 Process.Start 方法时,将会抛出 Win32Exception 异常
林德熙
2020/08/14
8700
启动管理员进程
当我们运行一个程序的时候有时需要提升到管理员权限,但是默认的C#程序的运行权限是当前用户的权限,那么怎么提升这个启动权限呢?
用户1175783
2019/09/18
8230
加强版在国内分发 UWP 应用正确方式 通过win32安装UWP应用
几乎所有国内的 UWP 开发者都知道,在国内开发 UWP 应用最大的问题不在于那么多系统的适配和不断修改的 API 接口,而是用户根本无法下载安装应用。在国内除非能掌握入口,否则想要将 UWP 开发应用在商业团队是很难的。刚好我所在的团队能将硬件设备直接给到用户,此时预装的系统里面就可以带上自主开发的 UWP 应用,解决了用户无法在应用商店安装应用的坑。但是大多数的团队都不能这样做,同时我的团队如果只是依靠硬件设备预装,那么会限制用户量。本文告诉大家如何使用传统的方法,将 UWP 作为 win32 应用安装包方法分发给用户安装
林德熙
2020/03/12
1.1K0
C#/.NET 使用 git 命令行来操作 git 仓库
我们可以在命令行中操作 git,但是作为一名程序员,如果在大量重复的时候还手动敲命令行,那就太笨了。
walterlv
2023/10/22
1.3K0
C#/.NET 使用 git 命令行来操作 git 仓库
Roslyn 将这个文件放在你的项目文件夹,无论哪个控制台项目都会输出林德熙是逗比
虽然已经通过很多篇博客告诉大家如何通过 Directory.Build.props 文件修改编译的方法,但是本文还是提供一个新的思路 只需要在项目文件夹,或者磁盘的文件夹,如 E:\ 放下本文提供的 Directory.Build.props 文件,整个文件夹内的控制台项目就会输出 林德熙是逗比 想要知道是怎么做的,请看下面
林德熙
2019/03/13
8300
Roslyn 获得 sln 文件所在的文件夹
我找了很久没有发现 SolutionDir 这个定义,所以只能通过一个不通用的方法找到 在之前的项目可以使用 PreBuildEvent 的方式指定编译之前事件,新的项目格式也可以支持这个方法,只是支持不是很好 我就遇到在 Jenkins 无法编译通过,因为 PreBuildEvent 指定的 $(SolutionDir) 是空 在新的项目格式,找了很久都没有找到 $(SolutionDir) 的定义和找到运行的 sln 文件的定义的方法 于是通过 Directory.Build.props 的方法找到 sln 文件 在 sln 文件所在的文件夹添加 Directory.Build.props 文件,因为很多项目的 sln 都在项目的最外,所以通过这个方法找到 sln 是可以的,只是不通用 如我有一个项目 lindexi 这个项目的文件夹请看下图
林德熙
2019/03/13
7820
Roslyn 获得 sln 文件所在的文件夹
dotnet OpenXML 聊聊文本段落对齐方式
本文来和大家聊聊在 OpenXML 里面,文本段落对齐方式。在 Word 和 PPT 的文本段落对齐规则是相同的,对齐的规则比较多,本文将一一告诉大家
林德熙
2021/12/01
1.5K0
dotnet OpenXML 聊聊文本段落对齐方式
dotnet 判断程序当前使用管理员运行降低权使用普通权限运行
有一些程序是不想通过管理员权限运行的,因为在很多文件的读写,如果用了管理员权限程序写入的程序,其他普通权限的程序是无法直接访问的。 本文告诉大家如何判断当前的程序是通过管理员权限运行,然后通过资源管理器使用普通权限运行
林德熙
2019/03/13
1.2K0
dotnet 判断程序当前使用管理员运行降低权使用普通权限运行
dotnet 获取程序所在路径的方法 Assembly.GetCallingAssemblyAssembly.GetEntryAssemblyAssembly.GetExecu
在 dotnet 有很多方法可以获取当前程序所在的路径,但是这些方法获取到的路径有一点不相同,特别是在工作路径不是当前的程序所在的路径的时候
林德熙
2019/03/15
2.9K0
dotnet 通过引用 msbuild 程序集实现自己定制编译器
本来我想说的是基于引用 msbuild 程序集来自己做一个编译器,但是想想好像本文做的,和造编译器没啥关系,咱自己调用 msbuild 的 API 而已。本文来告诉大家如何引用 msbuild 程序集,如何在自己的应用程序里面嵌入 msbuild 的构建代码,实现 dotnet build 的效果
林德熙
2021/12/24
7720
用 C# 写脚本 如何输出文件夹内所有文件名
大部分在 Windows 下的脚本都是使用 bat 或 cmd 写的,这部分的脚本对我来说可读性不好。这个可读性也是很主观的,对我来说用 C# 写脚本的可读性很强,但是换个小伙伴就不是了。在 .NET Core 下的 C# 可以通过 dotnet run 运行代码起来,此时特别适合用来写脚本
林德熙
2020/05/09
8170
WPF 使用 Pandoc 把 Markdown 转 Docx 选择文件获取文件的文件夹使用资源管理器打开文件夹选择指定文件
本文告诉大家如何通过 WPF 使用 Pandoc 把 Markdown 转 Docx 文件
林德熙
2019/03/13
1.3K0
WPF 使用 Pandoc 把 Markdown 转 Docx
            选择文件获取文件的文件夹使用资源管理器打开文件夹选择指定文件
dotnet C# 如果在构造函数抛出异常 析构函数是否会执行
请问以上代码的 ~Foo 是否可以在垃圾回收执行,或者说在构造函数里面抛出异常,是否这个对象可以被垃圾回收
林德熙
2021/12/24
5090
dotnet C# 反射扫描程序集所有类型会不会触发类型静态构造函数
在 dotnet 里面,有很多框架都喜欢扫描程序集进行初始化逻辑,在扫描程序集的所有类型的时候,相当于碰到所有类型。而某个类型的静态构造函数将会在某个类型被使用之前被 CLR 调用,那么扫描类型是否会触发此类型的静态构造函数的调用?答案是不会的
林德熙
2021/10/18
7170
推荐阅读
dotnet 测试在 UOS Linux 上使用 Process Start 打开文件的行为
3040
WPF 简单实现一个支持删除自身的应用
4020
dotnet 使用 NamedPipeClientStream 连接一个不存在管道服务名将不断空跑 CPU 资源
1.2K0
PublishFolderCleaner 让你的 dotnet 应用发布文件夹更加整洁
9570
dotnet 6 使用 CreateSymbolicLink 创建文件夹符号链接
1K0
C#学习笔记——启动其他进程
9020
dotnet core 在 MAC 系统下删除应用程序自己后调 Process Start 方法将会抛出 Win32 异常
8700
启动管理员进程
8230
加强版在国内分发 UWP 应用正确方式 通过win32安装UWP应用
1.1K0
C#/.NET 使用 git 命令行来操作 git 仓库
1.3K0
Roslyn 将这个文件放在你的项目文件夹,无论哪个控制台项目都会输出林德熙是逗比
8300
Roslyn 获得 sln 文件所在的文件夹
7820
dotnet OpenXML 聊聊文本段落对齐方式
1.5K0
dotnet 判断程序当前使用管理员运行降低权使用普通权限运行
1.2K0
dotnet 获取程序所在路径的方法 Assembly.GetCallingAssemblyAssembly.GetEntryAssemblyAssembly.GetExecu
2.9K0
dotnet 通过引用 msbuild 程序集实现自己定制编译器
7720
用 C# 写脚本 如何输出文件夹内所有文件名
8170
WPF 使用 Pandoc 把 Markdown 转 Docx 选择文件获取文件的文件夹使用资源管理器打开文件夹选择指定文件
1.3K0
dotnet C# 如果在构造函数抛出异常 析构函数是否会执行
5090
dotnet C# 反射扫描程序集所有类型会不会触发类型静态构造函数
7170
相关推荐
dotnet 测试在 UOS Linux 上使用 Process Start 打开文件的行为
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验