إصدار غير مستقر واحد
0.0.1 | 10 نوفمبر 2023 |
---|
#55 في #local-file
20KB
229 خطوط كود، باستثناء التعليقات
s3-filesystem
هذه المكتبة هي واجهة بسيطة لتعامل ملفات S3. تسمح لك بفتح ملف، كتابة ملف، وتحريك عبر عناصر صندوق S3. سيتم إنشاء نسخة على جهازك لجعل S3 يشبه نظام الملفات المحلي قدر الإمكان.
تستخدم هذه المكتبة SDK الرسمي لـ AWS لعمليات S3 وتستخدم Tokio للواجهة المحلية.
تكون حذرًا عند استخدام المكتبة! يمكن أن يتم مسح البيانات الموجودة مسبقًا بكتابة الملفات، وسيتم تحميل S3 بتكلفة.
الاستخدام
أولاً، أنشئ هيكل OpenOptions يحتوي على صندوق S3 الذي ترغب في الاتصال به وأين ترغب في حفظ ملفات التخزين.
هناك ثلاث وظائف متاحة
- crate::OpenOptions::open_s3: ينزّل الملف وفتحه ويقوم بتقديم ملف Tokio لقراءة البيانات كمعيار.
- crate::OpenOptions::write_s3: يكتب الملف على القرص وS3، ويقوم بتقديم ملف Tokio.
- crate::OpenOptions::walkdir: يتحرك عبر عناصر صندوق S3، مع مسار اختياري لتحريك عبر مجموعة فرعية من العناصر.
فتح ملف
use s3_filesystem::OpenOptions;
use tokio::io::AsyncReadExt;
#[tokio::main]
async fn main() {
let bucket = "my_aws_s3_bucket".to_string();
// If a custom S3 client is needed, replace None with Some(client).
// Default behavior is to use AWS CLI env.
let open_options = OpenOptions::new(bucket, None)
.await
.mount_path("data/test/")
.force_download(true);
let mut file = open_options.open_s3("some_folder/some_file.csv").await.unwrap();
let mut string = String::new();
// Read the example file and print it.
file.read_to_string(&mut string).await.unwrap();
println!("String: {}", string);
}
كتابة ملف
use s3_filesystem::OpenOptions;
use tokio::fs;
const BUCKET: &'static str = "test-bucket";
#[tokio::main]
async fn main() {
let bucket = BUCKET.to_string();
let open_options = OpenOptions::new(bucket, None)
.await
.mount_path("data/test/")
.force_download(true);
let data = fs::read("data/manifest.txt").await.unwrap();
open_options.write_s3("manifest.txt", &data).await.unwrap();
println!("Data uploaded successfully");
}
Walkdir
use s3_filesystem::OpenOptions;
#[tokio::main]
async fn main() {
let bucket = "my_aws_s3_bucket".to_string();
let open_options = OpenOptions::new(bucket, None).await;
let data = open_options.walkdir("").await.unwrap();
for dat in data {
println!("Data: {:?}", dat);
}
}
Walkdir و تنزيل
use s3_filesystem::OpenOptions;
#[tokio::main]
async fn main() {
let bucket = "my_aws_s3_bucket".to_string();
let open_options = OpenOptions::new(bucket, None)
.await
.mount_path("data/test/")
.force_download(false);
let data = open_options
.walkdir("some_bucket_sub_folder")
.await
.unwrap();
// WARNING!
// Downloads and opens every file in the sub folder!
for entry in data {
if entry.folder {
continue;
}
let s3_stuff = open_options.open_s3(&entry.path).await.unwrap();
println!("Entry: {:?} downloaded", entry.path);
}
}
TODOs
- إضافة علامات الميزات للتفريغ التلقائي؟
- البحث عن التغييرات في الملف؟ إذا كانت البايتات مختلفة، قم بتنزيلها، وإلا قم بقراءتها من المخزن.
اختبار على أنظمة تشغيل أكثر مع حالات حافة أكثر - لم يتم إجراء الكثير من الاختبارات حتى الآن.
التزامنات
~28MB
~447K SLoC