دسترسی به نام تمام فایل های داخل SDCard
سلام دوستان
من کد زیر رو برای دسترسی به نام تمام فایل های داخل SDCard نوشتم اما نمیدونم چرا بجای نمایش نام فایل با پسوندش، آخرین پوشه قبل از فایل رو نمایش میده و در آرایه ذخیره میکنه. نکته عجیبش اینجاس که وقتی اسم پوشه ی خاصی رو بهش میدم، لیست همه فایل های داخلش رو نمایش میده ولی من میخوام آدرس اصلی SDCard رو بهش بدم که لیست تمام فایل ها رو نمایش بده که نمایش نمیده:
آدرس مسیر اصلی:
dir = Environment.getExternalStorageDirectory().toString();
اینم کد:
private void getDir(String dirPath) {
item = new ArrayList<String>();
path = new ArrayList<String>();
File f = new File(dirPath);
File[] files = f.listFiles();
for (int i = 0; i < files.length; i++) {
File file = files[i];
if (!file.isHidden() && file.canRead()) {
path.add(file.getPath());
if (file.isFile()) {
item.add(file.getName());
} else {
item.add(file.getName());
}
}
}
Log.i("LOG", "FILE_NAME: " + item);
Log.i("LOG", "FILE_PATH: " + path);
}
سلام آقای منصوری عزیز. می تونید با نوشتن یک تابع بازگشتی این کار رو انجام بدید. بدون نیاز به استفاده از آرایه ها و یک الگوریتم بهینه تر و خوب تر . با یک حلقه ی for زیر پوشه ها رو iterate کنید و به تمام فایل های زیر پوشه ها رو مرور کنید و عملیات مورد نظر رو (مثلا تغییر نام فایلها) انجام بدید.
از این کد میتونید استفاده کنید. یه پوشه رو بهش میدید (میتونید آدرس sdcard رو بدید تا تمام فایل های sdcard رو مرور کنه) و تمام فایل های sdcard رو مرور می کنید.
public void walk( String path ) {
File root = new File( path );
File[] list = root.listFiles();
if (list == null) return;
for ( File f : list ) {
if ( f.isDirectory() ) {
walk( f.getAbsolutePath() );
Log.i("LOG", "DIR" + f.getAbsoluteFile());
}
else {
// do your work here
Log.i("LOG", "File:" + f.getAbsoluteFile());
String s1 = f
.getAbsoluteFile()
.getName()
.substring(
0,
f.getAbsoluteFile().getName().lastIndexOf("."));
String s2 = f
.getAbsoluteFile()
.getName()
.substring(
f.getAbsoluteFile().getName().lastIndexOf(".") + 1,
f.getAbsoluteFile().getName().length());
File file = new File(f.getAbsoluteFile().getPath());
File file2 = new File(f.getAbsoluteFile().getParent() + "/."
+ s1 + "#" + s2);
boolean success = file.renameTo(file2);
}
}
}
اونجایی که نوشتم do your work here عملیات مورد نظر مانند تغییر نام فایل ها رو انجام بدید. یعنی اونجا f.getAbsoluteFile() نام فایل رو بهتون میده باید همون جا نام فایل رو با f.getAbsoluteFile() بگیرید و تغییر نام اش بدید یا هر کار دیگه ای دوست داشتید انجام بدید.
این طوری توی Oncreate یا هر جای دیگه تابع رو فراخوانی کنید .
walk(Environment.getExternalStorageDirectory().getPath() + "/");
همچنین بهتره کد رو توی Thread بذارید تا گوشی هنگ نکند و جزئیات عملیات رو به کاربر نشون بدید.
یه مورد دیگه که می خواست یادم بره اینه که یادتون نره که مجوز دسترسی به sd card رو در منیفست اضافه کنید.
موفق باشید :)
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .