بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

دسترسی به نام تمام فایل های داخل SDCard

مدیریت گفتگو
احسان منصوری 11 سال پیش
آخرین تغییر: 11 سال پیش

سلام دوستان

من کد زیر رو برای دسترسی به نام تمام فایل های داخل 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);

    }

نظرات

پاسخ‌ها 1

hamidd 11 سال پیش

سلام آقای منصوری عزیز. می تونید با نوشتن یک تابع بازگشتی این کار رو انجام بدید. بدون نیاز به استفاده از آرایه ها و یک الگوریتم بهینه تر و خوب تر . با یک حلقه ی 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 رو در منیفست اضافه کنید.

موفق باشید :)

 

نظرات

احسان منصوری 11 سال پیش
تا اینجا درست. لیست تمام فایلا رو نشون میده. فرض کن توی قسمت else دوتا فایل پیدا کرد. حالا میخوام اسم اون دوتا فایل رو عوض کنم یا پسوند فایلا رو حذف کنم یا هر کار دیگه. گیرم الان اینجاس:(
hamidd 11 سال پیش
چه جوری می خواهید که تغییر نام صورت بپذیره؟ مثلا نام فایل اول file1 و نام فایل دوم file2 بشه (به صورت ایندکس وار)؟
احسان منصوری 11 سال پیش
یه چیزی تو همین مایه ها. دقیقا میخوام یه نقطه بذارم اول اسم فایل و نقطه ی پسوند فایل رو هم تبدیل کنم به #
hamidd 11 سال پیش
آقای منصوری پاسخ رو آپدیت کردم. یه مشکلی هم توی فراخوانی بود درستش کردم. الان این کد تمام فایل های sdcard و فایل های زیر پوشه ها رو به شکلی که گفتید تغییر نام میده. برنامه رو با احتیاط اجرا کنید چون تمام فایل های کارت حافظه رو به شکلی که گفتید تغییر نام میده.همچنین بعضی فایل منیجر ها (مخصوصا فایل منیجر پیش فرض گوشی) ، فایل ها و پوشه هایی که ابتدای نامشون نقطه (dot) باشه رو نمایش نمیدن. بعد از اجرای برنامه ممکنه اگه فایل منیجر پیش فرض گوشی رو اجرا کنید هیچ فایلی رو نمایش نده ، پس نگران نباشید، چون فایل ها وجود دارن ولی نمایش داده نمیشن.
احسان منصوری 11 سال پیش
خیلی خیلی ممنونم. لطف کردی داداش. نه نگران مخفی شدن فایلا نیستم. با X-Plore میشه فایلای مخفی رو دید. ممنونم

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .