Skip to content

Commit 2c7869c

Browse files
committed
feat: add file path dir
1 parent 9ed4b07 commit 2c7869c

File tree

4 files changed

+233
-1
lines changed

4 files changed

+233
-1
lines changed

docs/basic/file-path-directory.md

Lines changed: 232 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,232 @@
1+
---
2+
sidebar_position: 51
3+
title: A.51. File, Path, Directory
4+
sidebar_label: A.51. File, Path, Directory
5+
---
6+
7+
Pada chapter ini kita akan belajar tentang beberapa API milik Rust yang disediakan untuk manajemen path dan file system.
8+
9+
## A.51.1. File path (`std::path::Path`)
10+
11+
`"/home/novalagung/Desktop/my text.txt"` adalah salah satu contoh file path. Di Rust, file path bisa direpresentasikan sebagai string (seperti yang sudah dicontohkan), atau menggunakan tipe data `Path`.
12+
13+
Tipe data `Path` tersedia dalam module `std::path`. Cara penggunaannya cukup mudah, sebagai contoh, beberapa filepath berikut menghasilkan path yang sama:
14+
15+
```rust
16+
let filepath_1 = "/home/novalagung/Desktop/my text.txt";
17+
let filepath_2 = Path::new("/home/novalagung/Desktop/my text.txt");
18+
let filepath_3 = Path::new("/home/novalagung/Desktop").join("my text.txt");
19+
let filepath_4 = Path::new("/home/novalagung").join("Desktop").join("my text.txt");
20+
let filepath_5 = Path::new("/home").join("novalagung/Desktop/my text.txt");
21+
```
22+
23+
## A.52.2. Method filepath
24+
25+
### ◉ Associated function `Path::new()`
26+
27+
Digunakan untuk membuat object `Path` dari suatu string. Contoh penerapan:
28+
29+
```rust
30+
Path::new("/home/novalagung/Desktop/my text.txt");
31+
```
32+
33+
### ◉ Method `join()`
34+
35+
Digunakan untuk menggabungkan segment filepath. Contoh penerapan:
36+
37+
```rust
38+
Path::new("/home/novalagung").join("Desktop").join("my text.txt");
39+
```
40+
41+
Hasil dari operasi di atas adalah path:
42+
43+
```
44+
/home/novalagung/Desktop/my text.txt
45+
```
46+
47+
### ◉ Method `exists()`
48+
49+
Digunakan untuk mengecek apakah suatu filepath ada atau tidak.
50+
51+
```rust
52+
if Path::new(path).exists() {
53+
// path exists
54+
}
55+
```
56+
57+
### ◉ Method `is_file()` & `is_dir()`
58+
59+
Method `is_file()` digunakan untuk mengecek apakah suatu filepath berisi file.
60+
61+
```rust
62+
if Path::new(path).is_file() {
63+
// path is a file
64+
}
65+
```
66+
67+
Sedangkan method `is_dir()` digunakan untuk mengecek apakah suatu filepath adalah folder/directory.
68+
69+
```rust
70+
if Path::new(path).is_dir() {
71+
// path contains directory
72+
}
73+
```
74+
75+
### ◉ Method `is_absolute()` & `is_relative()`
76+
77+
Method `is_absolute()` digunakan untuk mengecek apakah suatu filepath adalah *absolute path*.
78+
79+
```rust
80+
if Path::new(path).is_absolute() {
81+
// path is an absolute path
82+
}
83+
```
84+
85+
Sedangkan method `is_relative()` digunakan untuk mengecek apakah suatu filepath adalah *relative path*.
86+
87+
```rust
88+
if Path::new(path).is_relative() {
89+
// path is a relative path
90+
}
91+
```
92+
93+
## A.52.3. Module `std::fs` (file system)
94+
95+
`std::fs` merupakan module yang disediakan Rust untuk pengolahan file system. Didalamnya berisinya banyak sekali fungsi untuk keperluan seperti pembuatan file, modifikasi konten file, dan lainnya.
96+
97+
Sebagai contoh, untuk membuat suatu directory bisa menggunakan `fs::create_dir`. Isi argument pemanggilan fungsi dengan path dalam bentuk string (atau `std::path::Path` juga boleh).
98+
99+
```rust
100+
let path = "./files";
101+
let res = fs::create_dir(path);
102+
```
103+
104+
Fungsi `fs::create_dir` mengembalikan value bertipe `Result<(), Error>`. Gunakan pattern matching `match` untuk mengecek hasil operasi apakah sukses atau tidak.
105+
106+
```rust
107+
match fs::create_dir("./files") {
108+
Err(err) => {
109+
println!("error on creating directory! {}", err);
110+
return
111+
},
112+
_ => {},
113+
}
114+
```
115+
116+
> - Lebih detailnya mengenai tipe data `Result` dibahas pada chapter [Tipe Data → Result](/basic/result-type).
117+
> - Lebih detailnya mengenai pattern matching dibahas pada chapter [Pattern Matching](/basic/pattern-matching).
118+
119+
## A.52.4. Manajemen file system
120+
121+
### ◉ Pembuatan folder (`fs::create_dir`)
122+
123+
Fungsi `fs::create_dir` digunakan untuk membuat folder. Contoh penerapannya sudah dibahas di sesi [A.52.3. Module std::fs (file system)](/file-path-directory#a523-module-stdfs-file-system) di atas.
124+
125+
### ◉ Menulis konten file (`fs::write`)
126+
127+
Fungsi `fs::write` digunakan untuk membuat folder. Contoh penerapan:
128+
129+
```rust
130+
let path = Path::new("./files").join("target.txt");
131+
let content = "hello rust!";
132+
let res = fs::write(path, content);
133+
134+
match res {
135+
Err(err) => {
136+
println!("error on writing file {}! {}", path.to_str().unwrap_or_default(), err);
137+
return
138+
},
139+
_ => {},
140+
}
141+
```
142+
143+
Fungsi `fs::write` melakukan penulisan konten pada variabel `content` ke path `path`. Mode penulisannya adalah *overwrite* (bukan *append*), yang artinya konten lama pada filepath akan di-*replace* total dengan konten baru.
144+
145+
Jika file tidak ada pada `path` tujuan, maka otomatis dibuatkan file baru. Namun jika folder/directory dimana file akan dibuat/ditulis tidak ada, maka muncul error.
146+
147+
### ◉ Menghapus file (`fs::remove_file`)
148+
149+
Fungsi `fs::remove_file` digunakan untuk menghapus file pada suatu path. Contoh penerapan:
150+
151+
```rust
152+
let path = Path::new("./files").join("target.txt");
153+
let res = fs::remove_file(path);
154+
155+
match res {
156+
Err(err) => {
157+
println!("error on deleting file {}! {}", path.to_str().unwrap_or_default(), err);
158+
return
159+
},
160+
_ => {},
161+
}
162+
```
163+
164+
### ◉ Menghapus folder (`fs::remove_dir`)
165+
166+
Fungsi `fs::remove_dir` digunakan untuk menghapus folder/directory. Contoh penerapan:
167+
168+
```rust
169+
let path = Path::new("./files");
170+
let res = fs::remove_dir(path);
171+
172+
match res {
173+
Err(err) => {
174+
println!("error on deleting directory {}! {}", path.to_str().unwrap_or_default(), err);
175+
return
176+
},
177+
_ => {},
178+
}
179+
```
180+
181+
### ◉ List items dalam folder
182+
183+
Fungsi `fs::read_dir` digunakan untuk menampilkan list items suatu folder (baik subfolder ataupun file). Fungsi ini mengmbalikan nilai bertipe `Result<ReadDir, Error>`, untuk mengakses list items bisa menggunakan teknik pattern matching, atau boleh juga langsung di `unwrap()` (dengan resiko program bisa panic ketika ada error).
184+
185+
```rust
186+
let path = Path::new("D:\\Labs\\Adam Studio\\Ebook\\dasarpemrogramanrust\\file_path_directory_1");
187+
let paths = fs::read_dir(path).unwrap();
188+
189+
for path in paths {
190+
let item = path.unwrap();
191+
println!("file name: {:?}, file path: {:?}", item.file_name(), item.path().display())
192+
}
193+
```
194+
195+
Pada contoh di atas, penulis menggunakan testing path yang isinya 4 buah item:
196+
197+
![File, Path, Directory](img/file-path-directory-1.png)
198+
199+
Output program bisa dilihat pada gambar berikut:
200+
201+
![File, Path, Directory](img/file-path-directory-2.png)
202+
203+
Tipe data variabel `paths` di atas adalah `ReadDir` yang merupakan tipe data iterator. Jika digunakan pada keyword `for`, maka variabel element perulangan `path` akan bertipe data `Result<DirEntry, Error>`. Dari tipe ini kita bisa mengakses file name maupun file path.
204+
205+
---
206+
207+
## Catatan chapter 📑
208+
209+
### ◉ Source code praktik
210+
211+
<pre>
212+
<a href="https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/file_path_directory">
213+
github.com/novalagung/dasarpemrogramanrust-example/../file_path_directory
214+
</a>
215+
</pre>
216+
217+
### ◉ Work in progress
218+
219+
- Pembahasan tentang append content file (https://stackoverflow.com/questions/30684624/what-is-the-best-variant-for-appending-a-new-line-in-a-text-file)
220+
221+
### ◉ Chapter relevan lainnya
222+
223+
- [Tipe Data → Result](/basic/result-type)
224+
- [Pattern Matching](/basic/pattern-matching)
225+
226+
### ◉ Referensi
227+
228+
- https://doc.rust-lang.org/std/path/struct.Path.html
229+
- https://doc.rust-lang.org/rust-by-example/std_misc/path.html
230+
- https://doc.rust-lang.org/rust-by-example/std_misc/fs.html
231+
232+
---
8.44 KB
Loading
17.5 KB
Loading

examples

0 commit comments

Comments
 (0)