簡體   English   中英

如何檢查目錄是否存在文件?

[英]how to Check dir if file exists?

我正在開發一個將圖像下載到用戶手機的應用程序。下載部分正常工作,圖像存儲在“ / Android / data // files /”中。 我首先檢查文件是否存在,如果不存在,則要下載。 但是,當我運行該應用程序時,它會不斷拋出NullpointerException是否是因為在第一次運行時“ / Android / data // files /”不存在?

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    testtv = (TextView) findViewById(R.id.testtv);
    String imagename = "/img11.png";
    File image = new File(Environment.getExternalStorageDirectory()
            .getAbsolutePath()
            + "/Android/data/com.id.imagedownloader/files" + imagename);
    // testtv.setText(image.toString());

    if (image.exists()) {
        testtv.setText("file exists");
    } else {
        Boolean result = isDownloadManagerAvailable(getApplicationContext());
        if (result) {
            downloadFile(imagename);
        }
    }

}

@SuppressLint("NewApi")
public void downloadFile(String imagename) {
    // TODO Auto-generated method stub
    String DownloadUrl = "http://testing16.comlu.com/images/" + imagename;
    DownloadManager.Request request = new DownloadManager.Request(
            Uri.parse(DownloadUrl));
    request.setDescription("sample file for testing"); // appears the same
                                                        // in Notification
                                                        // bar while
                                                        // downloading
    request.setTitle("Test Title");
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        request.allowScanningByMediaScanner();
        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
    }
    String fileName = DownloadUrl.substring(
            DownloadUrl.lastIndexOf('/') + 1, DownloadUrl.length());
    request.setDestinationInExternalFilesDir(getApplicationContext(), null,
            fileName);

    // get download service and enqueue file
    DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
    manager.enqueue(request);

}

public static boolean isDownloadManagerAvailable(Context context) {
    try {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.GINGERBREAD) {
            return false;
        }
        Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.addCategory(Intent.CATEGORY_LAUNCHER);
        intent.setClassName("com.android.providers.downloads.ui",
                "com.android.providers.downloads.ui.DownloadList");
        List<ResolveInfo> list = context.getPackageManager()
                .queryIntentActivities(intent,
                        PackageManager.MATCH_DEFAULT_ONLY);
        return list.size() > 0;
    } catch (Exception e) {
        return false;
    }
}

LOGCAT

11-03 14:13:35.821: E/AndroidRuntime(771): FATAL EXCEPTION: main
11-03 14:13:35.821: E/AndroidRuntime(771): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.id.imagedownloader/com.id.imagedownloader.MainActivity}: java.lang.NullPointerException: file
11-03 14:13:35.821: E/AndroidRuntime(771):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955)
11-03 14:13:35.821: E/AndroidRuntime(771):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
11-03 14:13:35.821: E/AndroidRuntime(771):  at android.app.ActivityThread.access$600(ActivityThread.java:122)
11-03 14:13:35.821: E/AndroidRuntime(771):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
11-03 14:13:35.821: E/AndroidRuntime(771):  at android.os.Handler.dispatchMessage(Handler.java:99)
11-03 14:13:35.821: E/AndroidRuntime(771):  at android.os.Looper.loop(Looper.java:137)
11-03 14:13:35.821: E/AndroidRuntime(771):  at android.app.ActivityThread.main(ActivityThread.java:4340)
11-03 14:13:35.821: E/AndroidRuntime(771):  at java.lang.reflect.Method.invokeNative(Native Method)
11-03 14:13:35.821: E/AndroidRuntime(771):  at java.lang.reflect.Method.invoke(Method.java:511)
11-03 14:13:35.821: E/AndroidRuntime(771):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
11-03 14:13:35.821: E/AndroidRuntime(771):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
11-03 14:13:35.821: E/AndroidRuntime(771):  at dalvik.system.NativeStart.main(Native Method)
11-03 14:13:35.821: E/AndroidRuntime(771): Caused by: java.lang.NullPointerException: file
11-03 14:13:35.821: E/AndroidRuntime(771):  at android.net.Uri.fromFile(Uri.java:441)
11-03 14:13:35.821: E/AndroidRuntime(771):  at android.app.DownloadManager$Request.setDestinationFromBase(DownloadManager.java:504)
11-03 14:13:35.821: E/AndroidRuntime(771):  at android.app.DownloadManager$Request.setDestinationInExternalFilesDir(DownloadManager.java:466)
11-03 14:13:35.821: E/AndroidRuntime(771):  at com.id.imagedownloader.MainActivity.downloadFile(MainActivity.java:63)
11-03 14:13:35.821: E/AndroidRuntime(771):  at com.id.imagedownloader.MainActivity.onCreate(MainActivity.java:40)
11-03 14:13:35.821: E/AndroidRuntime(771):  at android.app.Activity.performCreate(Activity.java:4465)
11-03 14:13:35.821: E/AndroidRuntime(771):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
11-03 14:13:35.821: E/AndroidRuntime(771):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)
11-03 14:13:35.821: E/AndroidRuntime(771):  ... 11 more

將下載文件的本地目標設置為應用程序外部文件目錄中的路徑

request.setDestinationInExternalFilesDir(context,Environment.DIRECTORY_DOWNLOADS,image);

如果父文件夾不存在,請不要忘記使用mkdirs()創建目錄

setDestinationInExternalFilesDir需要dirType參數。 您應該像這樣使用它:

request.setDestinationInExternalFilesDir(getApplicationContext(), Environment.DIRECTORY_DOWNLOADS,
        fileName);

使用此功能,您可以從字節數組創建文件並檢查是否存在。 嘗試這樣的事情:

/**
 * Create new file from byte array
 * @param path  
 * @param array source
 * @throws IOException  
 */
public static void writeFile(String path, byte[] array) throws IOException {
    File file = new File(path);
    if (!file.exists() && array != null) {
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));
        bos.write(array);
        bos.flush();
        bos.close();
    } else {
        // the file exists...

    }
}

希望對你有幫助!!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM