7
7
*
8
8
* ## Security
9
9
*
10
- * This module prevents path traversal, not allowing absolute paths or parent dir components
11
- * (i.e. "/usr/path/to/file" or "../path/to/file" paths are not allowed).
12
- * Paths accessed with this API must be relative to one of the {@link BaseDirectory | base directories}
13
- * so if you need access to arbitrary filesystem paths, you must write such logic on the core layer instead .
10
+ * This module prevents path traversal, not allowing parent directory accessors to be used
11
+ * (i.e. "/usr/path/to/../ file" or "../path/to/file" paths are not allowed).
12
+ * Paths accessed with this API must be either relative to one of the {@link BaseDirectory | base directories}
13
+ * or created with the { @link https://v2.tauri.app/reference/javascript/api/namespacepath | path API} .
14
14
*
15
15
* The API has a scope configuration that forces you to restrict the paths that can be accessed using glob patterns.
16
16
*
32
32
* The available variables are:
33
33
* {@linkcode https://v2.tauri.app/reference/javascript/api/namespacepath/#appconfigdir | $APPCONFIG},
34
34
* {@linkcode https://v2.tauri.app/reference/javascript/api/namespacepath/#appdatadir | $APPDATA},
35
- * {@linkcode https://v2.tauri.app/reference/javascript/api/namespacepath/#appLocaldatadir | $APPLOCALDATA},
35
+ * {@linkcode https://v2.tauri.app/reference/javascript/api/namespacepath/#applocaldatadir | $APPLOCALDATA},
36
36
* {@linkcode https://v2.tauri.app/reference/javascript/api/namespacepath/#appcachedir | $APPCACHE},
37
37
* {@linkcode https://v2.tauri.app/reference/javascript/api/namespacepath/#applogdir | $APPLOG},
38
38
* {@linkcode https://v2.tauri.app/reference/javascript/api/namespacepath/#audiodir | $AUDIO},
@@ -269,13 +269,13 @@ class FileHandle extends Resource {
269
269
*
270
270
* @example
271
271
* ```typescript
272
- * import { open, read, close, BaseDirectory } from "@tauri-apps/plugin-fs"
272
+ * import { open, BaseDirectory } from "@tauri-apps/plugin-fs"
273
273
* // if "$APP/foo/bar.txt" contains the text "hello world":
274
- * const file = await open("foo/bar.txt", { baseDir: BaseDirectory.App });
274
+ * const file = await open("foo/bar.txt", { baseDir: BaseDirectory.AppConfig });
275
275
* const buf = new Uint8Array(100);
276
276
* const numberOfBytesRead = await file.read(buf); // 11 bytes
277
277
* const text = new TextDecoder().decode(buf); // "hello world"
278
- * await close( file.rid );
278
+ * await file.close( );
279
279
* ```
280
280
*
281
281
* @since 2.0.0
@@ -309,18 +309,20 @@ class FileHandle extends Resource {
309
309
*
310
310
* @example
311
311
* ```typescript
312
- * import { open, seek, write, SeekMode, BaseDirectory } from '@tauri-apps/plugin-fs';
312
+ * import { open, SeekMode, BaseDirectory } from '@tauri-apps/plugin-fs';
313
313
*
314
314
* // Given hello.txt pointing to file with "Hello world", which is 11 bytes long:
315
- * const file = await open('hello.txt', { read: true, write: true, truncate: true, create: true, baseDir: BaseDirectory.App });
316
- * await file.write(new TextEncoder().encode("Hello world"), { baseDir: BaseDirectory.App } );
315
+ * const file = await open('hello.txt', { read: true, write: true, truncate: true, create: true, baseDir: BaseDirectory.AppLocalData });
316
+ * await file.write(new TextEncoder().encode("Hello world"));
317
317
*
318
318
* // Seek 6 bytes from the start of the file
319
319
* console.log(await file.seek(6, SeekMode.Start)); // "6"
320
320
* // Seek 2 more bytes from the current position
321
321
* console.log(await file.seek(2, SeekMode.Current)); // "8"
322
322
* // Seek backwards 2 bytes from the end of the file
323
323
* console.log(await file.seek(-2, SeekMode.End)); // "9" (e.g. 11-2)
324
+ *
325
+ * await file.close();
324
326
* ```
325
327
*
326
328
* @since 2.0.0
@@ -338,10 +340,11 @@ class FileHandle extends Resource {
338
340
*
339
341
* @example
340
342
* ```typescript
341
- * import { open, fstat, BaseDirectory } from '@tauri-apps/plugin-fs';
342
- * const file = await open("file.txt", { read: true, baseDir: BaseDirectory.App });
343
- * const fileInfo = await fstat( file.rid );
343
+ * import { open, BaseDirectory } from '@tauri-apps/plugin-fs';
344
+ * const file = await open("file.txt", { read: true, baseDir: BaseDirectory.AppLocalData });
345
+ * const fileInfo = await file.stat( );
344
346
* console.log(fileInfo.isFile); // true
347
+ * await file.close();
345
348
* ```
346
349
*
347
350
* @since 2.0.0
@@ -360,19 +363,20 @@ class FileHandle extends Resource {
360
363
*
361
364
* @example
362
365
* ```typescript
363
- * import { ftruncate, open, write, read , BaseDirectory } from '@tauri-apps/plugin-fs';
366
+ * import { open, BaseDirectory } from '@tauri-apps/plugin-fs';
364
367
*
365
368
* // truncate the entire file
366
- * const file = await open("my_file.txt", { read: true, write: true, create: true, baseDir: BaseDirectory.App });
367
- * await ftruncate( file.rid );
369
+ * const file = await open("my_file.txt", { read: true, write: true, create: true, baseDir: BaseDirectory.AppLocalData });
370
+ * await file.truncate( );
368
371
*
369
372
* // truncate part of the file
370
- * const file = await open("my_file.txt", { read: true, write: true, create: true, baseDir: BaseDirectory.App });
371
- * await write( file.rid, new TextEncoder().encode("Hello World"));
372
- * await ftruncate( file.rid, 7);
373
+ * const file = await open("my_file.txt", { read: true, write: true, create: true, baseDir: BaseDirectory.AppLocalData });
374
+ * await file.write( new TextEncoder().encode("Hello World"));
375
+ * await file.truncate( 7);
373
376
* const data = new Uint8Array(32);
374
- * await read( file.rid, data);
377
+ * await file.read( data);
375
378
* console.log(new TextDecoder().decode(data)); // Hello W
379
+ * await file.close();
376
380
* ```
377
381
*
378
382
* @since 2.0.0
@@ -394,12 +398,12 @@ class FileHandle extends Resource {
394
398
*
395
399
* @example
396
400
* ```typescript
397
- * import { open, write, close, BaseDirectory } from '@tauri-apps/plugin-fs';
401
+ * import { open, write, BaseDirectory } from '@tauri-apps/plugin-fs';
398
402
* const encoder = new TextEncoder();
399
403
* const data = encoder.encode("Hello world");
400
- * const file = await open("bar.txt", { write: true, baseDir: BaseDirectory.App });
401
- * const bytesWritten = await write( file.rid, data); // 11
402
- * await close( file.rid );
404
+ * const file = await open("bar.txt", { write: true, baseDir: BaseDirectory.AppLocalData });
405
+ * const bytesWritten = await file.write( data); // 11
406
+ * await file.close( );
403
407
* ```
404
408
*
405
409
* @since 2.0.0
@@ -427,7 +431,9 @@ interface CreateOptions {
427
431
* @example
428
432
* ```typescript
429
433
* import { create, BaseDirectory } from "@tauri-apps/plugin-fs"
430
- * const file = await create("foo/bar.txt", { baseDir: BaseDirectory.App });
434
+ * const file = await create("foo/bar.txt", { baseDir: BaseDirectory.AppConfig });
435
+ * await file.write(new TextEncoder().encode("Hello world"));
436
+ * await file.close();
431
437
* ```
432
438
*
433
439
* @since 2.0.0
@@ -510,9 +516,9 @@ interface OpenOptions {
510
516
* @example
511
517
* ```typescript
512
518
* import { open, BaseDirectory } from "@tauri-apps/plugin-fs"
513
- * const file = await open("foo/bar.txt", { read: true, write: true, baseDir: BaseDirectory.App });
519
+ * const file = await open("foo/bar.txt", { read: true, write: true, baseDir: BaseDirectory.AppLocalData });
514
520
* // Do work with file
515
- * await close( file.rid );
521
+ * await file.close( );
516
522
* ```
517
523
*
518
524
* @since 2.0.0
@@ -548,7 +554,7 @@ interface CopyFileOptions {
548
554
* @example
549
555
* ```typescript
550
556
* import { copyFile, BaseDirectory } from '@tauri-apps/plugin-fs';
551
- * await copyFile('app.conf', 'app.conf.bk', { fromPathBaseDir: BaseDirectory.App , toPathBaseDir: BaseDirectory.App });
557
+ * await copyFile('app.conf', 'app.conf.bk', { fromPathBaseDir: BaseDirectory.AppConfig , toPathBaseDir: BaseDirectory.AppConfig });
552
558
* ```
553
559
*
554
560
* @since 2.0.0
@@ -591,7 +597,7 @@ interface MkdirOptions {
591
597
* @example
592
598
* ```typescript
593
599
* import { mkdir, BaseDirectory } from '@tauri-apps/plugin-fs';
594
- * await mkdir('users', { baseDir: BaseDirectory.App });
600
+ * await mkdir('users', { baseDir: BaseDirectory.AppLocalData });
595
601
* ```
596
602
*
597
603
* @since 2.0.0
@@ -643,14 +649,14 @@ interface DirEntry {
643
649
* import { readDir, BaseDirectory } from '@tauri-apps/plugin-fs';
644
650
* import { join } from '@tauri-apps/api/path';
645
651
* const dir = "users"
646
- * const entries = await readDir('users', { baseDir: BaseDirectory.App });
647
- * processEntriesRecursive (dir, entries);
648
- * async function processEntriesRecursive (parent, entries) {
652
+ * const entries = await readDir('users', { baseDir: BaseDirectory.AppLocalData });
653
+ * processEntriesRecursively (dir, entries);
654
+ * async function processEntriesRecursively (parent, entries) {
649
655
* for (const entry of entries) {
650
656
* console.log(`Entry: ${entry.name}`);
651
657
* if (entry.isDirectory) {
652
658
* const dir = await join(parent, entry.name);
653
- * processEntriesRecursive (dir, await readDir(dir, { baseDir: BaseDirectory.App }))
659
+ * processEntriesRecursively (dir, await readDir(dir, { baseDir: BaseDirectory.AppLocalData }))
654
660
* }
655
661
* }
656
662
* }
@@ -714,7 +720,7 @@ async function readFile(
714
720
* @example
715
721
* ```typescript
716
722
* import { readTextFile, BaseDirectory } from '@tauri-apps/plugin-fs';
717
- * const contents = await readTextFile('app.conf', { baseDir: BaseDirectory.App });
723
+ * const contents = await readTextFile('app.conf', { baseDir: BaseDirectory.AppConfig });
718
724
* ```
719
725
*
720
726
* @since 2.0.0
@@ -738,7 +744,7 @@ async function readTextFile(
738
744
* @example
739
745
* ```typescript
740
746
* import { readTextFileLines, BaseDirectory } from '@tauri-apps/plugin-fs';
741
- * const lines = await readTextFileLines('app.conf', { baseDir: BaseDirectory.App });
747
+ * const lines = await readTextFileLines('app.conf', { baseDir: BaseDirectory.AppConfig });
742
748
* for await (const line of lines) {
743
749
* console.log(line);
744
750
* }
@@ -804,8 +810,8 @@ interface RemoveOptions {
804
810
* @example
805
811
* ```typescript
806
812
* import { remove, BaseDirectory } from '@tauri-apps/plugin-fs';
807
- * await remove('users/file.txt', { baseDir: BaseDirectory.App });
808
- * await remove('users', { baseDir: BaseDirectory.App });
813
+ * await remove('users/file.txt', { baseDir: BaseDirectory.AppLocalData });
814
+ * await remove('users', { baseDir: BaseDirectory.AppLocalData });
809
815
* ```
810
816
*
811
817
* @since 2.0.0
@@ -844,7 +850,7 @@ interface RenameOptions {
844
850
* @example
845
851
* ```typescript
846
852
* import { rename, BaseDirectory } from '@tauri-apps/plugin-fs';
847
- * await rename('avatar.png', 'deleted.png', { oldPathBaseDir: BaseDirectory.App, newPathBaseDir: BaseDirectory.App });
853
+ * await rename('avatar.png', 'deleted.png', { oldPathBaseDir: BaseDirectory.App, newPathBaseDir: BaseDirectory.AppLocalData });
848
854
* ```
849
855
*
850
856
* @since 2.0.0
@@ -883,7 +889,7 @@ interface StatOptions {
883
889
* @example
884
890
* ```typescript
885
891
* import { stat, BaseDirectory } from '@tauri-apps/plugin-fs';
886
- * const fileInfo = await stat("hello.txt", { baseDir: BaseDirectory.App });
892
+ * const fileInfo = await stat("hello.txt", { baseDir: BaseDirectory.AppLocalData });
887
893
* console.log(fileInfo.isFile); // true
888
894
* ```
889
895
*
@@ -909,7 +915,7 @@ async function stat(
909
915
* @example
910
916
* ```typescript
911
917
* import { lstat, BaseDirectory } from '@tauri-apps/plugin-fs';
912
- * const fileInfo = await lstat("hello.txt", { baseDir: BaseDirectory.App });
918
+ * const fileInfo = await lstat("hello.txt", { baseDir: BaseDirectory.AppLocalData });
913
919
* console.log(fileInfo.isFile); // true
914
920
* ```
915
921
*
@@ -941,16 +947,16 @@ interface TruncateOptions {
941
947
*
942
948
* @example
943
949
* ```typescript
944
- * import { truncate, readFile, writeFile , BaseDirectory } from '@tauri-apps/plugin-fs';
950
+ * import { truncate, readTextFile, writeTextFile , BaseDirectory } from '@tauri-apps/plugin-fs';
945
951
* // truncate the entire file
946
- * await truncate("my_file.txt", 0, { baseDir: BaseDirectory.App });
952
+ * await truncate("my_file.txt", 0, { baseDir: BaseDirectory.AppLocalData });
947
953
*
948
954
* // truncate part of the file
949
- * let file = "file.txt";
950
- * await writeFile(file, new TextEncoder().encode( "Hello World") , { baseDir: BaseDirectory.App });
951
- * await truncate(file , 7);
952
- * const data = await readFile(file , { baseDir: BaseDirectory.App });
953
- * console.log(new TextDecoder().decode( data) ); // "Hello W"
955
+ * const filePath = "file.txt";
956
+ * await writeTextFile(filePath, "Hello World", { baseDir: BaseDirectory.AppLocalData });
957
+ * await truncate(filePath , 7, { baseDir: BaseDirectory.AppLocalData } );
958
+ * const data = await readTextFile(filePath , { baseDir: BaseDirectory.AppLocalData });
959
+ * console.log(data); // "Hello W"
954
960
* ```
955
961
*
956
962
* @since 2.0.0
@@ -995,7 +1001,7 @@ interface WriteFileOptions {
995
1001
*
996
1002
* let encoder = new TextEncoder();
997
1003
* let data = encoder.encode("Hello World");
998
- * await writeFile('file.txt', data, { baseDir: BaseDirectory.App });
1004
+ * await writeFile('file.txt', data, { baseDir: BaseDirectory.AppLocalData });
999
1005
* ```
1000
1006
*
1001
1007
* @since 2.0.0
@@ -1023,7 +1029,7 @@ async function writeFile(
1023
1029
* ```typescript
1024
1030
* import { writeTextFile, BaseDirectory } from '@tauri-apps/plugin-fs';
1025
1031
*
1026
- * await writeTextFile('file.txt', "Hello world", { baseDir: BaseDirectory.App });
1032
+ * await writeTextFile('file.txt', "Hello world", { baseDir: BaseDirectory.AppLocalData });
1027
1033
* ```
1028
1034
*
1029
1035
* @since 2.0.0
0 commit comments