Windows编程----进程的当前目录

进程的当前目录

Windows  Api中有大量的函数在调用的时候,需要传递路径。比如创建文件,创建目录,删除目录,删除文件等等。拿创建文件的CreateFile函数做比喻,如果我们要创建的文件路径不是全路径,那么windows在创建的时候,首先会获取到进程的当前目录,然后用这个目录拼接成一个全路径创建文件。

一般情况下通过双击启动的exe进程,进程的当前目录就是exe文件所在的目录。VS调试环境下,进程的当前目录不是exe文件所在路径,而是项目文件所在的路径。拿C++控制台程序来说,后缀为vcxproj的项目文件在那里,进程的目录就是那里。

通过GetCurrentDirectory可以获取到进程的当前目录。

#include <iostream>
#include <Windows.h>

int main()
{
    // 定义缓冲区大小
    WCHAR currentDir[MAX_PATH];
    // 获取当前工作目录
    DWORD length = GetCurrentDirectory(MAX_PATH, currentDir);
    // 输出当前工作目录
    std::wcout << L"Current Directory: " << currentDir << std::endl;
    return 0;
}

我的项目文件在D:\project\ConsoleApp1\ConsoleApp目录下,当我用VS调试项目之后,输出的进程的当前目录为D:\project\ConsoleApp1\ConsoleApp,下面是运行结果。

但是当我直接在进程进程管理器中打开exe文件之后,输出的结果就是当前exe文件所在的目录,参考下图运行结果。

使用相对路径创建文件

接下来我们来演示一下,创建文件CreateFile的时候,不传全路径,这个文件会创建在哪里。上面已经提到:如果我们要创建的文件路径不是全路径,那么windows在创建的时候,首先会获取到进程的当前目录,然后用这个目录拼接成一个全路径创建文件。我们执行下面代码,并且我们用VS调试。

#include <iostream>
#include <Windows.h>

int main()
{
    // 定义缓冲区大小
    WCHAR currentDir[MAX_PATH];
    // 获取当前工作目录
    DWORD length = GetCurrentDirectory(MAX_PATH, currentDir);
    // 输出当前工作目录
    std::wcout << L"Current Directory: " << currentDir << std::endl;

    // 定义文件路径
    LPCWSTR filePath = L"file.txt";
    // 创建或打开文件
    HANDLE hFile = CreateFile(
        filePath,                // 文件名
        GENERIC_READ | GENERIC_WRITE, // 访问模式
        0,                       // 共享模式
        NULL,                    // 安全属性
        CREATE_ALWAYS,           // 创建选项
        FILE_ATTRIBUTE_NORMAL,   // 文件属性
        NULL                     // 模板文件句柄
    );

	system("pause");
    return 0;
}

下面是运行结果图,可以很清晰的看到,在当前项目的同级目录下,创建了一个file.txt文件。

如果我们把文件的改成下面的路径,那么在项目文件的上一级目录你会发现创建了一个file.txt文件,大家可以自行实验。-

LPCWSTR filePath = L"..\file.txt";

接下来,我们在进程管理器中直接双击exe启动,就会发现在当前exe的同级目录下创建了一个file.txt文件。运行效果如下:

修改进程的当前目录

进程的当前目录,并不是一成不变的,我们可以在调用ShellExecute的时候,手动设置进程的当前目录。也可以调用SetCurrentDirectory设置进程的当前目录。下面的代码中:首先我们获取到进程的当前目录并输出,然后修改目录为D:\\,随后输出修改后的目录,并且创建一个file.txt。调试之后,我们会发现在D盘下创建了一个file.txt的文件。这就是进程的当前目录的作用

#include <iostream>
#include <Windows.h>

int main()
{
    // 定义缓冲区大小
    WCHAR currentDir[MAX_PATH];
    // 获取当前工作目录
    DWORD length = GetCurrentDirectory(MAX_PATH, currentDir);
    // 输出当前工作目录
    std::wcout << L"Current Directory: " << currentDir << std::endl;

    // 设置新的工作目录
    LPCWSTR newDir = L"D:\\";
    SetCurrentDirectory(newDir);

    // 再次获取并输出新的工作目录
    length = GetCurrentDirectory(MAX_PATH, currentDir);
    std::wcout << L"New Current Directory: " << currentDir << std::endl;

    // 定义文件路径
    LPCWSTR filePath = L"file.txt";
    // 创建或打开文件
    HANDLE hFile = CreateFile(
        filePath,                // 文件名
        GENERIC_READ | GENERIC_WRITE, // 访问模式
        0,                       // 共享模式
        NULL,                    // 安全属性
        CREATE_ALWAYS,           // 创建选项
        FILE_ATTRIBUTE_NORMAL,   // 文件属性
        NULL                     // 模板文件句柄
    );

	system("pause");
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/984068.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis-Plus分页控件使用及使用过程发现的一个坑

最近维护一个旧项目的时候&#xff0c;出现了一个BUG&#xff0c;经排查后发现是Mybatis-plus分页控件使用的时候需要注意的一个问题&#xff0c;故在本地使用MybatisPlus模拟出现了一下这个问题。 首先&#xff0c;先说一下MyBatis-Plus的使用&#xff1a; 1&#xff09;引入…

服务端和客户端通信(TCP)

服务端 using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks;namespace TeachTcpServer {class Program{static void Main(string[] args){#region 知识点一 …

Windows下配置Flutter移动开发环境以及AndroidStudio安装和模拟机配置

截止 2025/3/9 &#xff0c;版本更新到了 3.29.1 &#xff0c;但是为了防止出现一些奇怪的bug&#xff0c;我安装的还是老一点的&#xff0c;3.19&#xff0c;其他版本的安装同理。AndroidStudio用的是 2024/3/1 版本。 — 1 环境变量&#xff08;Windows&#xff09; PUB_H…

C++11中的Condition_variable

C11中的condition_variable 在C11中&#xff0c;条件变量&#xff08;std::condition_variable&#xff09;是线程同步机制之一&#xff0c;用于在多线程环境中实现线程间的通信和协调。它允许一个或多个线程在某个条件尚未满足时等待&#xff0c;直到其他线程通知条件已经满足…

ROS2-话题学习

强烈推荐教程&#xff1a; 《ROS 2机器人开发从入门到实践》3.2.2订阅小说并合成语音_哔哩哔哩_bilibili 构建功能包 # create package demo_python_pkg ros2 pkg create --build-type ament_python --license Apache-2.0 demo_python_pkg 自己写的代码放在./demo_python_pkg/…

深度学习模型Transformer核心组件—前馈网络FFN

第一章&#xff1a;人工智能之不同数据类型及其特点梳理 第二章&#xff1a;自然语言处理(NLP)&#xff1a;文本向量化从文字到数字的原理 第三章&#xff1a;循环神经网络RNN&#xff1a;理解 RNN的工作机制与应用场景(附代码) 第四章&#xff1a;循环神经网络RNN、LSTM以及GR…

Helm安装chart包到k8s报错“不能重复使用名称,名称已被使用”

一、报错提示如下 “Error: INSTALLATION FAILED: cannot re-use a name that is still in use”,意思是安装chart时提供的名称已存在&#xff0c;不能重复使用同一个名称。 登录后复制 rootiZ:/usr/local/src/my-helm-repo/charts# helm install mymemcached3 memcached -n te…

容器编排革命:从 Docker Run 到 Docker Compose 的进化之路20250309

容器编排革命&#xff1a;从 Docker Run 到 Docker Compose 的进化之路 一、容器化部署的范式转变 在 Docker 生态系统的演进中&#xff0c;容器编排正从“手动操作”走向“自动化管理”。根据 Docker 官方 2023 年开发者调查报告&#xff0c;78% 的开发者已采用 Docker Compo…

对开源VLA sota π0的微调——如何基于各种开源数据集、以及你自己的私有数据集微调π0(含我司的微调实践)

前言 25年2.4日&#xff0c;几个月前推出π0的公司Physical Intelligence (π)宣布正式开源π0及π0-FAST&#xff0c;如之前所介绍的&#xff0c;他们对用超过 10,000 小时的机器人数据进行了预训练 该GitHub代码仓库「 π0及π0-FAST的GitHub地址&#xff1a;github.com/Ph…

VBA使用fso对象合并指定路径的txt文件(含子目录)

图(1) 前几天我跟大家分享了在VBA中如何获取指定类型文件的路径的方法&#xff0c;其中最重要的一个思路就是在处理完当前目录的文件后&#xff0c;再调用程序自身来对子目录进行处理&#xff0c;以此来实现对子目录的无限循环&#xff0c;直至所有文件都处理完毕为止。按照此设…

nginx反向代理功能

如上图所示&#xff0c;当配置好nginx反向代理服务器的时候&#xff0c;客户端向nginx反向代理服务器发送请求&#xff0c;nginx反向代理服务器再向真实服务器转发请求。 nginx作为反向代理就是利用nginx高并发&#xff0c;速度快的特性&#xff0c;让nginx能够承受更多的链接…

deepseek在pycharm中的配置和简单应用

对于最常用的调试python脚本开发环境pycharm&#xff0c;如何接入deepseek是我们窥探ai代码编写的第一步&#xff0c;熟悉起来总没坏处。 1、官网安装pycharm社区版&#xff08;免费&#xff09;&#xff0c;如果需要安装专业版&#xff0c;需要另外找破解码。 2、安装Ollama…

【江协科技STM32】ADC数模转换器-学习笔记

ADC简介 ADC&#xff08;Analog-Digital Converter&#xff09;模拟-数字转换器ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁&#xff0c;ADC是一种将连续的模拟信号转换为离散的数字信号的设备或模块12位逐次逼近型…

八卡5090服务器首发亮相!

AI 人工智能领域热度居高不下。OpenAI 的 GPT - 4 凭强悍语言处理能力&#xff0c;在内容创作、智能客服等领域广泛应用。清华大学团队的 DeepSeek 大模型在深度学习训练优势突出&#xff0c;正促使各行业应用端算力需求向推理主导转变&#xff0c;呈爆发式增长 。 随着 DeepS…

hadoop集群环境配置

目录 VMware虚拟机安装 Xshell安装 网络问题 centos7下载 ---------参考以下视频步骤进行生态搭建---------- 搭建好hadoop01 克隆出hadoop02、hadoop03 启动三台虚拟机 打开终端 输入 记录下各个ip 打开Xshell&#xff0c;新建会话 修改主机名 配置静态IP 主机名称…

【GPU】什么是NCCL和Simple, LL, LL128通信协议

​​​​​​​什么是NCCL 简介 NCCL 的原理 机器内通信&#xff1a; 机器间通信&#xff1a; NCCL通信协议 简介 NCCL通信选择协议规则 ​​​​​​​1 自动选择 ​​​​​​​2 强制选择 Simple协议 1 介绍 2 Simple 协议的基本格式 2 Simple 协议的示例 Sim…

aws(学习笔记第三十一课) aws cdk深入学习(batch-arm64-instance-type)

aws(学习笔记第三十一课) aws cdk深入学习 学习内容&#xff1a; 深入练习aws cdk下部署batch-arm64-instance-type 1. 深入练习aws cdk下部署batch-arm64-instance-type 代码链接 代码链接 代码链接 -> batch-arm64-instance-type之前代码学习 之前学习代码链接 -> aw…

单细胞多数据集整合和去除批次效应教程,代做各领域生信分析

单细胞多数据集整合和去除批次效应教程 每个数据集的数据分别单独进行读取单细胞数据构建Seurat分析对象 读取各种来源的单细胞数据构建Seurat分析对象的教程 做这一步的时候可以查看我这篇写的非常详细的教程文章&#xff1a; 【腾讯文档】单细胞分析步骤1读取各种来源格式…

什么是OFD文件?2025年我推荐新版OFD阅读器和PDF阅读器,双合一

说起文档格式&#xff0c;大家第一反应肯定是PDF&#xff0c;但你知道吗&#xff1f;现在OFD也越来越常见了&#xff0c;特别是在一些正式文件上。刚开始我也是一脸懵&#xff0c;心想这OFD文件咋看啊&#xff1f;网上一搜&#xff0c;发现原来有专门对付它的阅读器&#xff0c…

计算机网络----主要内容简介

这里写目录标题 章节概览每章的大体结构结构功能与服务的关系 一些概念概念一概念二传统的网络层的工作方式&#xff08;路由IP&#xff09;现代的网络层的工作方式&#xff08;SDN&#xff09; 二级目录二级目录 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二…