Linux 目錄操作詳解

Linux目錄操作詳解

      • 1. 獲取當前工作目錄
        • 1.1 getcwd()
        • 1.2 get_current_dir_name()
      • 2. 切換工作目錄
        • 2.1 chdir()
      • 3. 創建和刪除目錄
        • 3.1 mkdir()
        • 3.2 rmdir()
      • 4. 獲取目錄中的文件列表
        • 4.1 opendir() 打開目錄
        • 4.2 readdir() 讀取目錄內容
        • 4.3 closedir() 關閉目錄
      • 5. dirent 結構體
      • 6. 示例代碼
        • (1) 獲取當前工作目錄
        • (2)切換工作目錄
        • (3)創建和刪除目錄
        • (4)遍歷目錄中的文件
        • (5)結合所有操作的示例

本文將介紹常用的Linux目錄操作函數,包括獲取當前工作目錄、切換工作目錄、創建和刪除目錄等操作。

1. 獲取當前工作目錄

Linux提供了兩個常用函數來獲取當前工作目錄。

1.1 getcwd()

該函數用于獲取當前進程的工作目錄,并將路徑存儲在用戶提供的緩沖區中。

函數原型:

char *getcwd(char *buf, size_t size);
  • buf:存儲當前工作目錄路徑的緩沖區。
  • size:緩沖區的大小。

如果成功,返回當前工作目錄的路徑;如果失敗,返回NULL,并設置errno。

1.2 get_current_dir_name()

這是一個較為簡化的函數,不需要傳入緩沖區,它會動態分配內存來存儲當前目錄的路徑。

函數原型:

char *get_current_dir_name(void);

調用此函數后,返回的字符串指向當前工作目錄的路徑,使用完后需要調用free()來釋放內存。

2. 切換工作目錄

切換工作目錄的操作在文件操作中經常會用到。Linux提供了一個函數chdir()來實現該操作。

2.1 chdir()

該函數用于改變當前進程的工作目錄。

函數原型:

int chdir(const char *path);
  • path:目標目錄的路徑。

返回值:

  • 成功:返回0。
  • 失敗:返回-1,errno會被設置為具體的錯誤碼(如目錄不存在或權限不足)。

3. 創建和刪除目錄

3.1 mkdir()

用于創建一個新目錄。需要提供目錄名和訪問權限。

函數原型:

int mkdir(const char *pathname, mode_t mode);
  • pathname:新目錄的路徑。
  • mode:目錄權限,通常使用如0755來設定權限。

返回值:

  • 成功:返回0。
  • 失敗:返回-1,errno會設置相應的錯誤。
3.2 rmdir()

用于刪除一個空目錄。刪除時,目錄必須為空。

函數原型:

int rmdir(const char *path);
  • path:需要刪除的目錄路徑。

返回值:

  • 成功:返回0。
  • 失敗:返回-1,errno會設置具體的錯誤原因(如目錄非空)。

4. 獲取目錄中的文件列表

獲取目錄中的文件列表通常需要遍歷目錄。Linux提供了一些API來幫助我們打開、讀取和關閉目錄。

4.1 opendir() 打開目錄

函數原型:

DIR *opendir(const char *pathname);
  • pathname:需要打開的目錄路徑。

返回值:

  • 成功:返回DIR*,即目錄流。
  • 失敗:返回NULLerrno設置為錯誤碼。
4.2 readdir() 讀取目錄內容

函數原型:

struct dirent *readdir(DIR *dirp);
  • dirp:通過opendir()獲得的目錄流。

返回值:

  • 成功:返回指向dirent結構體的指針,其中包含了當前目錄項的信息。
  • 失敗:返回NULL
4.3 closedir() 關閉目錄

函數原型:

int closedir(DIR *dirp);
  • dirp:需要關閉的目錄流。

返回值:

  • 成功:返回0。
  • 失敗:返回-1。

5. dirent 結構體

在通過readdir()函數獲取目錄項時,返回的是一個dirent結構體,該結構體定義了目錄項的相關信息。

結構體定義:

struct dirent {long d_ino;             // inode編號off_t d_off;            // 偏移量unsigned short d_reclen; // 目錄項長度unsigned char d_type;   // 文件類型char d_name[NAME_MAX+1]; // 文件名
};
  • d_name:存儲目錄項的文件名,最大長度為255字符。
  • d_type:文件類型,可能的值包括普通文件(DT_REG)、目錄(DT_DIR)、符號鏈接(DT_LNK)等。

6. 示例代碼

(1) 獲取當前工作目錄

以下示例展示了如何使用getcwd()get_current_dir_name()獲取當前工作目錄:

#include <iostream>
#include <unistd.h>
#include <stdlib.h>using namespace std;int main() {// 使用getcwd()獲取當前工作目錄char path1[256];if (getcwd(path1, sizeof(path1)) != NULL) {cout << "Current working directory (getcwd): " << path1 << endl;} else {perror("getcwd failed");}// 使用get_current_dir_name()獲取當前工作目錄char *path2 = get_current_dir_name();if (path2 != NULL) {cout << "Current working directory (get_current_dir_name): " << path2 << endl;free(path2);  // 注意釋放內存} else {perror("get_current_dir_name failed");}return 0;
}
(2)切換工作目錄

示例展示了如何使用chdir()函數來切換工作目錄:

#include <iostream>
#include <unistd.h>
#include <stdlib.h>using namespace std;int main() {// 獲取當前工作目錄char currentDir[256];if (getcwd(currentDir, sizeof(currentDir)) != NULL) {cout << "Current working directory: " << currentDir << endl;} else {perror("getcwd failed");return 1;}// 切換到新的目錄if (chdir("/home") == 0) {cout << "Changed working directory to /home" << endl;} else {perror("chdir failed");return 1;}// 獲取切換后的工作目錄if (getcwd(currentDir, sizeof(currentDir)) != NULL) {cout << "New working directory: " << currentDir << endl;} else {perror("getcwd failed");}return 0;
}
(3)創建和刪除目錄

以下示例展示了如何使用mkdir()創建目錄和rmdir()刪除空目錄:

#include <iostream>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <stdlib.h>using namespace std;int main() {const char *dirName = "testDir";// 創建目錄if (mkdir(dirName, 0755) == 0) {cout << "Directory " << dirName << " created successfully." << endl;} else {perror("mkdir failed");return 1;}// 刪除目錄if (rmdir(dirName) == 0) {cout << "Directory " << dirName << " deleted successfully." << endl;} else {perror("rmdir failed");return 1;}return 0;
}
(4)遍歷目錄中的文件

以下示例展示了如何使用opendir(), readdir(), 和 closedir()來遍歷目錄中的文件:

#include <iostream>
#include <dirent.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>using namespace std;int main() {const char *dirName = "/home";// 打開目錄DIR *dir = opendir(dirName);if (dir == NULL) {perror("opendir failed");return 1;}struct dirent *entry;// 遍歷目錄中的文件cout << "Files in directory " << dirName << ":" << endl;while ((entry = readdir(dir)) != NULL) {cout << "File: " << entry->d_name << endl;}// 關閉目錄closedir(dir);return 0;
}
(5)結合所有操作的示例

以下是一個較為完整的示例,結合了獲取當前目錄、切換目錄、創建目錄和遍歷目錄等操作:

#include <iostream>
#include <unistd.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <stdlib.h>using namespace std;int main() {char currentDir[256];// 獲取當前工作目錄if (getcwd(currentDir, sizeof(currentDir)) != NULL) {cout << "Current working directory: " << currentDir << endl;} else {perror("getcwd failed");return 1;}// 創建目錄const char *dirName = "exampleDir";if (mkdir(dirName, 0755) == 0) {cout << "Directory " << dirName << " created successfully." << endl;} else {perror("mkdir failed");return 1;}// 切換到新創建的目錄if (chdir(dirName) == 0) {cout << "Changed to directory " << dirName << endl;} else {perror("chdir failed");return 1;}// 獲取切換后的工作目錄if (getcwd(currentDir, sizeof(currentDir)) != NULL) {cout << "New working directory: " << currentDir << endl;} else {perror("getcwd failed");}// 列出當前目錄中的文件DIR *dir = opendir(".");if (dir == NULL) {perror("opendir failed");return 1;}struct dirent *entry;cout << "Files in the current directory:" << endl;while ((entry = readdir(dir)) != NULL) {cout << "File: " << entry->d_name << endl;}// 關閉目錄closedir(dir);// 刪除目錄if (rmdir(dirName) == 0) {cout << "Directory " << dirName << " deleted successfully." << endl;} else {perror("rmdir failed");return 1;}return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/66743.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/66743.shtml
英文地址,請注明出處:http://en.pswp.cn/web/66743.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring 依賴注入詳解:創建 Bean 和注入依賴是一回事嗎?

1. 什么是依賴注入&#xff08;Dependency Injection&#xff0c;DI&#xff09;&#xff1f; 依賴注入 是 Spring IoC&#xff08;控制反轉&#xff09;容器的核心功能。它的目標是將對象的依賴&#xff08;如其他對象或配置&#xff09;從對象本身中剝離&#xff0c;由容器負…

AI時代的網絡安全:傳統技術的落寞與新機遇

AI時代的網絡安全&#xff1a;傳統技術的落寞與新機遇 在AI技術飛速發展的浪潮中&#xff0c;網絡安全領域正經歷著前所未有的變革。一方面&#xff0c;傳統網絡安全技術在面對新型攻擊手段時逐漸顯露出局限性&#xff1b;另一方面&#xff0c;AI為網絡安全帶來了新的機遇&…

后端開發Web

Maven Maven是apache旗下的一個開源項目&#xff0c;是一款用于管理和構建java項目的工具 Maven的作用 依賴管理 方便快捷的管理項目依賴的資源&#xff08;jar包&#xff09;&#xff0c;避免版本沖突問題 統一項目結構 提供標準、統一的項目結構 項目構建 標準跨平臺(…

前沿技術趨勢洞察:2024年技術的嶄新篇章與未來走向!

引言 時光飛逝&#xff0c;2024年已經來臨&#xff0c;回顧過去一年&#xff0c;科技的迅猛進步簡直讓人目不暇接。 在人工智能&#xff08;AI&#xff09;越來越強大的今天&#xff0c;我們不再停留在幻想階段&#xff0c;量子計算的雛形開始展示它的無窮潛力&#xff0c;Web …

【10.2】隊列-設計循環隊列

一、題目 設計你的循環隊列實現。 循環隊列是一種線性數據結構&#xff0c;其操作表現基于 FIFO&#xff08;先進先出&#xff09;原則并且隊尾被連接在隊首之后以形成一個循環。它也被稱為“環形緩沖器”。 循環隊列的一個好處是我們可以利用這個隊列之前用過的空間。在一個普…

博客之星2024年度總評選——我的年度創作回顧與總結

2024年&#xff0c;是我在CSDN博客上持續耕耘、不斷成長的一年。在此&#xff0c;與大家分享一下我的年度創作回顧與總結。 一、創作成長與突破 在人工智能領域&#xff0c;技術迭代迅速&#xff0c;知識更新頻繁。為了保持自己的競爭力&#xff0c;在今年&#xff0c;我始終…

IDEA運行Java項目總會報程序包xxx不存在

我的在另外一臺電腦上跑是沒有問題的&#xff0c;在新的電腦上跑的時候&#xff0c;又出現了這個惡心的問題...... 思來想去&#xff0c;唯一的問題就是我的mavn環境沒的配置好 如何在本地部署mavn環境&#xff0c;這里推薦一篇很好的文章&#xff1a; Maven安裝與配置&…

java 根據前端傳回的png圖片數組,后端加水印加密碼生成pdf,返回給前端

前端傳回的png圖片數組&#xff0c;后端加水印加密碼生成pdf&#xff0c;返回給前端 場景&#xff1a;重點&#xff1a;maven依賴controllerservice 場景&#xff1a; 當前需求&#xff0c;前端通過html2canvas將頁面報表生成圖片下載&#xff0c;可以仍然不滿意。 需要java后…

數據分庫分表和遷移方案

在我們業務快速發展的過程中&#xff0c;數據量必然也會迎來突飛猛漲。那么當我們的數據量百倍、千倍、萬倍、億倍增長后&#xff0c;原有的單表性能就不能滿足我們日常的查詢和寫入了&#xff0c;此時數據架構就不得不進行拆分&#xff0c;比如單表拆分成10張表、100張表、單個…

線上突發:MySQL 自增 ID 用完,怎么辦?

線上突發&#xff1a;MySQL 自增 ID 用完&#xff0c;怎么辦&#xff1f; 1. 問題背景2. 場景復現3. 自增id用完怎么辦&#xff1f;4. 總結 1. 問題背景 最近&#xff0c;我們在數據庫巡檢的時候發現了一個問題&#xff1a;線上的地址表自增主鍵用的是int類型。隨著業務越做越…

[Java] Solon 框架的三大核心組件之一插件擴展體系

1、Solon 的三大核心組件 核心組件說明Plugin 插件擴展機制提供“編碼風格”的擴展體系Ioc/Aop 應用容器提供基于注入依賴的自動裝配體系ContextHandler 通用上下文處理接口提供“開放式處理”適配體系&#xff08;俗稱&#xff0c;三元合一&#xff09; 2、Solon Plugin 插件…

TRELLIS微軟的圖生3D

TRELLIS 教程目錄&#xff1a; Youtube&#xff1a;https://www.youtube.com/watch?vJqFHZ-dRMhI 官網地址&#xff1a;https://trellis3d.github.io/ GitHub&#xff1a;https://github.com/Microsoft/TRELLIS 部署目錄&#xff1a; 克隆項目 git clone --recurse-submodul…

Java導出通過Word模板導出docx文件并通過QQ郵箱發送

一、創建Word模板 {{company}}{{Date}}服務器運行情況報告一、服務器&#xff1a;總告警次數&#xff1a;{{ServerTotal}} 服務器IP:{{IPA}}&#xff0c;總共告警次數:{{ServerATotal}} 服務器IP:{{IPB}}&#xff0c;總共告警次數:{{ServerBTotal}} 服務器IP:{{IPC}}&#x…

【22】Word:小李-高新技術企業政策?

目錄 題目? NO1.2 NO3 NO4 NO5.6 NO7.8 NO9.10 若文章中存在刪除空白行等要求&#xff0c;可以到最后來完成。注意最后一定要檢查此部分&#xff01;注意&#xff1a;大多是和事例一樣即可&#xff0c;不用一摸一樣&#xff0c;但也不要差太多。 題目 NO1.2 F12Fn&a…

自動化部署(三):項目管理平臺

一、項目管理平臺作用 幫助團隊高效規劃、執行和監控項目進度&#xff0c;確保任務按時完成并實現目標 敏捷開發&#xff1a;提供標準敏捷研發管理&#xff0c;支持Scrum 與 Kanban 規模化敏捷&#xff1a;支持大型研發團隊跨項目協同&#xff0c;實現多項目路線圖規劃和資源管…

常用集合-數據結構-MySql

目錄 java核心&#xff1a; 常用集合與數據結構: 單例集合: 雙列集合: 線程安全的集合: ConcurrentHashMap集合: HashTable集合: CopyOnWriteArrayList集合: CopyOnWriteArraySet集合: ConcurrentLinkedQueue隊列: ConcurrentSkipListMap和ConcurrentSkipListSet&…

IP屬地與視頻定位位置不一致:現象解析與影響探討

在數字化時代&#xff0c;IP屬地和視頻定位位置已成為我們獲取網絡信息、判斷內容真實性的重要依據。然而&#xff0c;有時我們會發現&#xff0c;某些視頻內容中展示的定位位置與其發布者的IP屬地并不一致。這種不一致現象引發了廣泛的關注和討論。本文旨在深入剖析IP屬地與視…

計算機畢業設計hadoop+spark股票基金推薦系統 股票基金預測系統 股票基金可視化系統 股票基金數據分析 股票基金大數據 股票基金爬蟲

溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 作者簡介&#xff1a;Java領…

機器學習-數據集劃分

文章目錄 一. 為什么要劃分數據集二. 數據集劃分的方法1. 留出法&#xff1a;2. 交叉驗證&#xff1a;將數據集劃分為訓練集&#xff0c;驗證集&#xff0c;測試集3. 留一法&#xff1a;4. 自助法&#xff1a; 一. 為什么要劃分數據集 為了能夠評估模型的泛化能力&#xff0c;可…

根據當前用戶的活動、當地天氣和喜歡音樂類型,然后根據這些信息來播放相應的Spotify音樂 附python代碼

這段代碼是一個Python腳本,它使用了幾個外部庫來創建一個簡單的圖形用戶界面(GUI),讓用戶根據當前用戶的活動、當地天氣和喜歡音樂類型,然后根據這些信息來播放相應的音樂。 1. **導入庫**: - `openai`:用于與OpenAI API交互(盡管在這段代碼中沒有使用)。 - `sp…