【问题标题】:android development + how to build a folder and file that will be saved within this folder?android development + 如何建立一个文件夹和将保存在这个文件夹中的文件?
【发布时间】:2013-12-27 12:38:44
【问题描述】:

我正在创建一个 android 应用程序,该应用程序将创建一个文件夹,其文件夹名称为当前日期和时间,其中将是一个文件,该文件具有用户在保存笔记后将输入的文件名。

但问题是系统显示错误:open failed ONEONT(NO such file or directory)

代码

package com.devleb.idapp;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.DatePickerDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Environment;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class SignSoldgerActivity extends Activity {

    EditText edit_txt_note;
    final Context context = this;

    SimpleDateFormat formatter;
    // attribute for the date picker

    public String fileName;
    String userinputResult;

    Button btn_save_soldger;
    TextView txtatePicker;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sign_soldger);

        edit_txt_note = (EditText) findViewById(R.id.editTxtNote);

        txtatePicker = (TextView) findViewById(R.id.txtDate);

        btn_save_soldger = (Button) findViewById(R.id.btnSaveSoldger);
        btn_save_soldger.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {

                // / for creating a dialog
                LayoutInflater li = LayoutInflater.from(context);
                View promptsView = li.inflate(R.layout.prompts, null);

                AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
                        context);

                // set prompts.xml to alertdialog builder
                alertDialogBuilder.setView(promptsView);

                final EditText userInput = (EditText) promptsView
                        .findViewById(R.id.editTextDialogUserInput);

                // set dialog message
                alertDialogBuilder
                        .setCancelable(false)
                        .setPositiveButton("OK",
                                new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog,
                                            int id) {
                                        // get user input and set it to result
                                        // edit text
                                        userinputResult = userInput.getText()
                                                .toString();

                                        formatter = new SimpleDateFormat(
                                                "yyyy-MM-dd-HH-mm-ss");
                                        Date now = new Date();
                                        /*
                                         * fileName = formatter.format(now) +
                                         * "-" + userinputResult;
                                         */
                                        fileName = formatter.format(now);

                                        saveFile(fileName);
                                        txtatePicker.setText(fileName);
                                    }
                                })
                        .setNegativeButton("Cancel",
                                new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog,
                                            int id) {
                                        dialog.cancel();
                                    }
                                });

                // create alert dialog
                AlertDialog alertDialog = alertDialogBuilder.create();

                // show it
                alertDialog.show();

            }

        });

    }

    // / for saving the file on the SD

    public void saveFile(String fileName) {
        try {
            // String newFolder = fileName;

            String newFolder = "/" + fileName;

            /*
             * String sdPath = Environment.getExternalStorageDirectory()
             * .getAbsolutePath() + "/" + fileName + ".txt".toString();
             */

            String sdPath = Environment.getExternalStorageDirectory()
                    .getAbsolutePath() + "/" + userinputResult + ".txt".toString();

            //File myFile = new File(sdPath);
            File myFolder = new File(newFolder);
            myFolder.mkdirs();
            File myFile = new File(myFolder + sdPath);
            myFile.createNewFile();

            Toast.makeText(getBaseContext(), "the second step in saving file",
                    Toast.LENGTH_SHORT).show();

            FileOutputStream fOut = new FileOutputStream(myFile);
            OutputStreamWriter myOutWriter = new OutputStreamWriter(fOut);

            // append or write
            myOutWriter.append(edit_txt_note.getText());
            myOutWriter.close();
            fOut.close();
            edit_txt_note.setText("");
            Toast.makeText(getBaseContext(), "Done Writing SD" + fileName,
                    Toast.LENGTH_SHORT).show();

        } catch (Exception e) {

            Toast.makeText(getBaseContext(), e.getMessage(), Toast.LENGTH_SHORT)
                    .show();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.sign_soldger, menu);
        return true;
    }

}

【问题讨论】:

    标签: android string error-handling fileoutputstream


    【解决方案1】:

    在尝试写入 SD 卡之前,请尝试检查其状态。它可能被用作共享驱动器、损坏、已满等。状态列表可以在这里找到:http://developer.android.com/reference/android/os/Environment.html

    这是获取状态的示例

    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        mExternalStorageAvailable = mExternalStorageWriteable = true;
    } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
        mExternalStorageAvailable = true;
        mExternalStorageWriteable = false;
    } else {
        mExternalStorageAvailable = mExternalStorageWriteable = false;
    }
    

    然后添加这个权限:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    

    在您的 manifest.xml 文件中

    【讨论】:

      【解决方案2】:

      您确定您已添加此权限以写入外部存储

      android.permission.WRITE_EXTERNAL_STORAGE
      

      使用此代码创建新文件夹、新文件

       String sdPath = Environment.getExternalStorageDirectory().toString() + "/"+ newFolder;
      
            //File myFile = new File(sdPath);
            File myFolder = new File(sdPath);
            if (!myFolder.exists()) {
            myFolder.mkdirs();
            }
            File myFile = new File(sdPath + File.separator+fileName);
            myFile.createNewFile();
      

      【讨论】:

      • 是的先生,我认为问题出在文件夹创建上,因为在我添加文件夹创建步骤之前,系统已创建文件
      • 如果您的问题没有得到解决,我可以看到正在执行创建文件夹和文件的整个班级
      • 对于新文件夹也提供sdcard路径,如果你遇到同样的问题,提供logcat trace
      猜你喜欢
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      • 2019-06-18
      • 1970-01-01
      • 1970-01-01
      • 2013-02-02
      • 2011-01-19
      相关资源
      最近更新 更多