Search
Duplicate

path provider

path provider

ํ”Œ๋Ÿฌํ„ฐ ์•ฑ์—์„œ ํŒŒ์ผ ์ €์žฅ ์œ„์น˜๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ง€์›ํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
dependencies: path_provider: ^2.1.5
Markdown
๋ณต์‚ฌ

์ฃผ์š” ์ €์žฅ ์œ„์น˜

์ €์žฅ ์œ„์น˜
์„ค๋ช…
Temporary directory
์บ์‹œ๊ฐ™์ด ์ž„์‹œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„์ด๊ณ  ์–ธ์ œ๋“ ์ง€ ์‚ญ์ œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Documents directory
ํ•ด๋‹น ์•ฑ๋งŒ์˜ ์ €์žฅ๊ณต๊ฐ„์ด๋ฉฐ ์•ฑ์ด ์‚ญ์ œ๋˜๋ฉด ์—†์–ด์ง‘๋‹ˆ๋‹ค.
Downloads directory
๋‹ค์šด๋กœ๋“œํ•œ ํŒŒ์ผ์„ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค.
Application Support directory
์•ฑ์˜ ์„ค์ •์ด๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค.

์ฃผ์š” ๋ฉ”์†Œ๋“œ

๋ฉ”์†Œ๋“œ
๋ฐ˜ํ™˜๊ฐ’
์„ค๋ช…
getTemporaryDirectory()
Directory
Temporary directory๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
getApplicationDocumentsDirectory()
Directory
Documents directory๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
getDownloadsDirectory()
Directory
Downloads directory๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
getApplicationSupportDirectory()
Directory
Application Support directory๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ์ฝ”๋“œ

import 'package:path_provider/path_provider.dart'; void main() async { // Temporary directory๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. Directory temporaryDirectory = await getTemporaryDirectory(); print(temporaryDirectory.path); // /data/user/0/com.example.myapp/cache // Documents directory๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. Directory documentsDirectory = await getApplicationDocumentsDirectory(); print(documentsDirectory.path); // /data/user/0/com.example.myapp/documents // Downloads directory๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. Directory downloadsDirectory = await getDownloadsDirectory(); print(downloadsDirectory.path); // /storage/emulated/0/Download // Application Support directory๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. Directory applicationSupportDirectory = await getApplicationSupportDirectory(); print(applicationSupportDirectory.path); // /data/user/0/com.example.myapp/shared_prefs }
Dart
๋ณต์‚ฌ

์นด๋“œ ๋ฉ”๋ชจ ์•ฑ ๋งŒ๋“ค๊ธฐ

๊ฐ„๋‹จํ•œ List ๋ฐ์ดํ„ฐ๋ฅผ txt ํŒŒ์ผ๋กœ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ

์ฃผ์š” ๊ธฐ๋Šฅ

โ€ข
๋ฉ”๋ชจ ์นด๋“œ ์ž‘์„ฑ: ๋ฉ”๋ชจ ์ž…๋ ฅ ํ›„, ํ”Œ๋กœํŒ… ๋ฒ„ํŠผ ํด๋ฆญ
โ€ข
๋ฉ”๋ชจ ์นด๋“œ ์‚ญ์ œ: ๋ฉ”๋ชจ ์นด๋“œ ๊ธธ๊ฒŒ ๋ˆ„๋ฅด๊ธฐ

pubspce.yaml

name: shared_data_app description: "A new Flutter project." publish_to: 'none' version: 1.0.0+1 environment: sdk: '>=3.2.3 <4.0.0' dependencies: flutter: sdk: flutter # ๊ณต์œ  ํ™˜๊ฒฝ์„ค์ • shared_preferences: ^2.5.1 # ํŒŒ์ผ path_provider: ^2.1.5 cupertino_icons: ^1.0.2 dev_dependencies: flutter_test: sdk: flutter flutter_lints: ^2.0.0 flutter: uses-material-design: true assets: - repo/
YAML
๋ณต์‚ฌ

main.dart

import 'dart:io'; import 'package:flutter/material.dart'; import 'package:path_provider/path_provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; void main() { // SharedPrefences ๊ณต์œ  ํ™˜๊ฒฝ์„ค์ •์— ๋ฐ์ดํ„ฐ ์ €์žฅ ์˜ˆ์ œ runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), useMaterial3: true, ), home: const FileApp(), ); } } class FileApp extends StatefulWidget { const FileApp({super.key}); State<FileApp> createState() => _FileAppState(); } class _FileAppState extends State<FileApp> { TextEditingController _controller = TextEditingController(); List<String> itemList = []; void initState() { super.initState(); initData(); } void initData() async { List<String> savedItemList = await readListFile(); setState(() { itemList = savedItemList; }); } // ํŒŒ์ผ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ํ•จ์ˆ˜ // ๐Ÿ“• โžก List Future<List<String>> readListFile() async { List<String> itemList = []; // ์ตœ์ดˆ ํŒŒ์ผ ์ƒ์„ฑ // - ์ฒ˜์Œ ํŒŒ์ผ ์ƒ์„ฑ ์‹œ, SharedPeferences ๋กœ 'frist' ๋ผ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธ var key = 'first'; SharedPreferences pref = await SharedPreferences.getInstance(); var firstCheck = pref.getBool(key); var dir = await getApplicationDocumentsDirectory(); var file; bool fileExist = await File(dir.path + '/test.txt').exists(); // ์ตœ์ดˆ์ธ ๊ฒฝ์šฐ // 1. null 2. false if( firstCheck == null || firstCheck == false || fileExist == false ) { pref.setBool(key, true); // ์ตœ์ดˆ ํŒŒ์ผ ์ƒ์„ฑ // - ํ”„๋กœ์ ํŠธ ์•ˆ์˜ ํŒŒ์ผ ๊ฐ€์ ธ์˜ค๊ธฐ file = await DefaultAssetBundle.of(context).loadString('repo/test.txt'); // - ๊ฐ€์ ธ์˜จ ํŒŒ์ผ๋กœ ์Šค๋งˆํŠธํฐ์— ์ €์žฅํ•˜๊ธฐ File(dir.path + '/test.txt').writeAsStringSync(file); } else { // ํŒŒ์ผ ์ฝ๊ธฐ // File(ํŒŒ์ผ๊ฒฝ๋กœ) file = await File(dir.path + '/test.txt').readAsString(); } var array = file.split('\n'); // \n (์—”ํ„ฐ) for (var item in array) { itemList.add(item); } return itemList; } // ํŒŒ์ผ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ํ•จ์ˆ˜ void writeListFile(String data) async { // ํŒŒ์ผ ๊ฐ€์ ธ์˜ค๊ธฐ var dir = await getApplicationDocumentsDirectory(); var file = await File(dir.path + '/test.txt').readAsString(); // ๊ธฐ์กด ํŒŒ์ผ์— ์ƒˆ ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ file = file + '\n' + data; // ํŒŒ์ผ ์ €์žฅ File(dir.path + '/test.txt').writeAsStringSync(file); } // ํŒŒ์ผ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š” ํ•จ์ˆ˜ Future<bool> deleteListFile(int index) async { // itemList ์—์„œ index ์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ ์‚ญ์ œ List<String> copyList = []; copyList.addAll(itemList); copyList.removeAt(index); // copyList ์˜ ๋ฐ์ดํ„ฐ๋“ค์„ '\n' ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ var fileData = ""; for (var item in copyList) { fileData += item + "\n"; } // ํŒŒ์ผ ์ €์žฅ try { var dir = await getApplicationDocumentsDirectory(); File(dir.path + '/test.txt').writeAsStringSync(fileData); } catch (e) { print(e); return false; } return true; } Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text('File App'),), body: Container( child: Center( child: Column( children: [ // TextFied : controller, keyboardType Padding( padding: EdgeInsets.all(20.0), child: TextField( controller: _controller, keyboardType: TextInputType.text, onSubmitted: (data) { print(data); writeListFile(data); setState(() { itemList.add(data); }); _controller.text = ''; }, ), ), const SizedBox(height: 10.0,), Expanded( child: ListView.builder( itemBuilder: (context, index) { return GestureDetector( onLongPress: () async { // ๊ธธ๊ฒŒ ๋ˆ„๋ฅธ ์นด๋“œ ์‚ญ์ œ bool check = await deleteListFile(index); if( check ) { setState(() { itemList.removeAt(index); }); } }, child: Card( child: Center( child: Text( itemList[index], style: TextStyle(fontSize: 20.0), ), ), ), ); }, itemCount: itemList.length, ) ), ], ) ), ), floatingActionButton: FloatingActionButton( onPressed: () { writeListFile(_controller.text); setState(() { itemList.add(_controller.text); }); _controller.text = ''; }, child: Icon(Icons.create), ), ); } }
Dart
๋ณต์‚ฌ

Flutter path_provider ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

1. path_provider๋ž€?

path_provider๋Š”
์•ฑ์—์„œ ํŒŒ์ผ์„ ์ €์žฅํ•  ํด๋” ๊ฒฝ๋กœ(Path) ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” Flutter ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.
์˜ˆ: ๋ฌธ์„œํด๋”, ์ž„์‹œํด๋”, ๋‹ค์šด๋กœ๋“œํด๋” ๋“ฑ. (Dart packages)
Flutter ์•ฑ์ด ํŒŒ์ผ์„ ์ €์žฅํ•  ์œ„์น˜๋ฅผ OS๋ณ„๋กœ ์•Œ์•„์„œ ์ฐพ์•„์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
Android / iOS / Windows / macOS / Linux ๋ชจ๋‘ ์ง€์›.

2. ์–ธ์ œ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?

๊ธฐ๋Šฅ
์‚ฌ์šฉ ์—ฌ๋ถ€
JSON ํŒŒ์ผ ์ €์žฅ
O
๋ฉ”๋ชจ ์•ฑ
O
์ด๋ฏธ์ง€ ํŒŒ์ผ ์ €์žฅ
O
PDF ์ €์žฅ
O
SQLite DB
O
์บ์‹œ ํŒŒ์ผ
O
ํŒŒ์ผ ์ €์žฅ = path_provider ๊ฑฐ์˜ ๋ฌด์กฐ๊ฑด ์‚ฌ์šฉ

3. ์„ค์น˜

pubspec.yaml

dependencies: path_provider: ^2.0.0
YAML
๋ณต์‚ฌ

import

import 'package:path_provider/path_provider.dart'; import 'dart:io';
Dart
๋ณต์‚ฌ

4. ์ฃผ์š” Directory ์ข…๋ฅ˜

path_provider์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ๋Š” ํ•จ์ˆ˜
ํ•จ์ˆ˜
์„ค๋ช…
getTemporaryDirectory()
์ž„์‹œํŒŒ์ผ
getApplicationDocumentsDirectory()
์•ฑ ๋ฌธ์„œ ์ €์žฅ
getApplicationSupportDirectory()
์•ฑ ๋ฐ์ดํ„ฐ
getDownloadsDirectory()
๋‹ค์šด๋กœ๋“œ ํด๋”
getExternalStorageDirectory()
์™ธ๋ถ€ ์ €์žฅ์†Œ(Android)
์˜ˆ์‹œ:
Directory tempDir = await getTemporaryDirectory(); Directory docDir = await getApplicationDocumentsDirectory();
Dart
๋ณต์‚ฌ

5. ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ๋Š” Directory

โ˜…โ˜…โ˜…โ˜…โ˜… ๋งค์šฐ ์ค‘์š”

getApplicationDocumentsDirectory()
Dart
๋ณต์‚ฌ
์•ฑ์—์„œ ํŒŒ์ผ ์ €์žฅํ•  ๋•Œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ
์˜ˆ:
โ€ข
๋ฉ”๋ชจ ํŒŒ์ผ
โ€ข
JSON ๋ฐ์ดํ„ฐ
โ€ข
SQLite DB
โ€ข
์„ค์ • ํŒŒ์ผ
์•ฑ ์‚ญ์ œํ•˜๋ฉด ๊ฐ™์ด ์‚ญ์ œ๋จ

6. ๊ธฐ๋ณธ ์‚ฌ์šฉ ์˜ˆ์ œ

ํŒŒ์ผ ์ €์žฅ ์˜ˆ์ œ

import 'package:path_provider/path_provider.dart'; import 'dart:io'; Future<void> writeFile() async { final directory = await getApplicationDocumentsDirectory(); final path = directory.path; File file = File('$path/test.txt'); await file.writeAsString('Hello Flutter'); }
Dart
๋ณต์‚ฌ

ํŒŒ์ผ ์ฝ๊ธฐ

Future<String> readFile() async { final directory = await getApplicationDocumentsDirectory(); final path = directory.path; File file = File('$path/test.txt'); return await file.readAsString(); }
Dart
๋ณต์‚ฌ

7. ์ „์ฒด ํ๋ฆ„ ๊ตฌ์กฐ

Flutter ํŒŒ์ผ ์ €์žฅ ๊ตฌ์กฐ ํ๋ฆ„
path_provider โ†’ ํด๋” ๊ฒฝ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ โ†“ Directory โ†“ File โ†“ write / read
Plain Text
๋ณต์‚ฌ
์ฝ”๋“œ ๊ตฌ์กฐ
final dir = await getApplicationDocumentsDirectory(); final file = File('${dir.path}/data.txt'); await file.writeAsString("hello");
Dart
๋ณต์‚ฌ

8. path vs path_provider ์ฐจ์ด

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
์—ญํ• 
path
๊ฒฝ๋กœ ๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ
path_provider
์ €์žฅ ํด๋” ์œ„์น˜ ๊ฐ€์ ธ์˜ค๊ธฐ
์ •๋ฆฌ:
path_provider โ†’ ์–ด๋””์— ์ €์žฅํ• ์ง€ path โ†’ ๊ฒฝ๋กœ ๋ฌธ์ž์—ด ํ•ฉ์น˜๊ธฐ
Plain Text
๋ณต์‚ฌ
์˜ˆ:
import 'package:path/path.dart' as path; final fullPath = path.join(dir.path, 'file.txt');
Dart
๋ณต์‚ฌ

9. ์ •๋ฆฌ

path_provider ํ•œ ์ค„ ์ •๋ฆฌ

Flutter์—์„œ ํŒŒ์ผ์„ ์ €์žฅํ•  ํด๋” ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

๊ฐ€์žฅ ๋งŽ์ด ์“ฐ๋Š” ์ฝ”๋“œ

final dir = await getApplicationDocumentsDirectory(); final file = File('${dir.path}/data.txt'); await file.writeAsString("hello");
Dart
๋ณต์‚ฌ

๊ธฐ์–ตํ•  ํ•จ์ˆ˜ 3๊ฐœ

getTemporaryDirectory() getApplicationDocumentsDirectory() getDownloadsDirectory()
Plain Text
๋ณต์‚ฌ

10. ์ดํ•ดํ•˜๊ธฐ

path_provider = ์ง‘ ์ฃผ์†Œ ์•Œ๋ ค์ฃผ๋Š” ์‚ฌ๋žŒ Directory = ์ง‘ File = ์ง‘ ์•ˆ์˜ ํŒŒ์ผ
Plain Text
๋ณต์‚ฌ
์ฃผ์†Œ ์ฐพ๊ธฐ โ†’ ์ง‘ ์ฐพ๊ธฐ โ†’ ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ โ†’ ์ €์žฅ
Plain Text
๋ณต์‚ฌ

๋ฒ„์ „ ํ˜ธํ™˜ ์ด์Šˆ

gradle.properties

org.gradle.java.home=C:/Program Files/Java/jdk-17
Markdown
๋ณต์‚ฌ

app/build.gradle

compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } kotlinOptions { jvmTarget = JavaVersion.VERSION_17 }
Markdown
๋ณต์‚ฌ