2013-11-25 59 views
7

我想要这个片段写入一个csv文件时,单击按钮,但我不断收到java.io.IOException:打开失败:ENOENT(没有这样的文件或目录)。任何帮助将不胜感激。Android没有创建文件

public class AddFragment extends Fragment { 

    static EditText spent,saved,coupons; 
    Button writeExcelButton; 
    String data; 
    Spinner spinner; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.add_layout, container, false); 

     setSpinnerContent(view); 

     spent = (EditText) view.findViewById(R.id.spent1); 
     saved = (EditText) view.findViewById(R.id.saved1); 
     coupons = (EditText) view.findViewById(R.id.coupons1); 

     writeExcelButton = (Button) view.findViewById(R.id.button_addGroc); 
     writeExcelButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       updateSheet(); 
      } 
     }); 

     return view; 
    } 

    private void setSpinnerContent (View view) { 
     spinner = (Spinner) view.findViewById(R.id.groc_store); 
     ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(), 
      R.array.store1, android.R.layout.simple_spinner_item); 
     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     spinner.setAdapter(adapter); 
    } 

    public void updateSheet() { 
     try { 
      // This is the string that should be written to file 
      String mySpin =spinner.getSelectedItem().toString(); 
      data = mySpin + "," + spent.getText().toString() + "," + saved.getText().toString() + "," + coupons.getText().toString() + "/n"; 

      // This is the file that should be written to 
      String sdCard = Environment.getExternalStorageDirectory().toString(); 
      File dir = new File(sdCard + "/dir"); 
      if (!dir.exists()) { 
       dir.mkdir(); 
      } 

      File myFile = new File(dir.getAbsolutePath(), "savings.csv"); 

      // if file doesn't exists, then create it 
      if (!myFile.exists()) { 
       myFile.createNewFile(); 
      } 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

这是我的logcat的样子

11-14 13:29:23.681: W/System.err(14386): java.io.IOException: open failed: ENOENT (No such file or directory) 
11-14 13:29:23.681: W/System.err(14386): at java.io.File.createNewFile(File.java:948) 
11-14 13:29:23.691: W/System.err(14386): at com.example.myfirstapp.AddFragment.updateSheet(AddFragment.java:101) 
11-14 13:29:23.691: W/System.err(14386): at com.example.myfirstapp.AddFragment$1.onClick(AddFragment.java:59) 
11-14 13:29:23.691: W/System.err(14386): at android.view.View.performClick(View.java:4240) 
11-14 13:29:23.691: W/System.err(14386): at android.view.View$PerformClick.run(View.java:17721) 
11-14 13:29:23.691: W/System.err(14386): at android.os.Handler.handleCallback(Handler.java:730) 
11-14 13:29:23.691: W/System.err(14386): at android.os.Handler.dispatchMessage(Handler.java:92) 
11-14 13:29:23.691: W/System.err(14386): at android.os.Looper.loop(Looper.java:137) 
11-14 13:29:23.691: W/System.err(14386): at android.app.ActivityThread.main(ActivityThread.java:5103) 
11-14 13:29:23.691: W/System.err(14386): at java.lang.reflect.Method.invokeNative(Native Method) 
11-14 13:29:23.691: W/System.err(14386): at java.lang.reflect.Method.invoke(Method.java:525) 
11-14 13:29:23.701: W/System.err(14386): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
11-14 13:29:23.711: W/System.err(14386): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
11-14 13:29:23.711: W/System.err(14386): at dalvik.system.NativeStart.main(Native Method) 
11-14 13:29:23.711: W/System.err(14386): Caused by: libcore.io.ErrnoException: open failed: ENOENT (No such file or directory) 
11-14 13:29:23.711: W/System.err(14386): at libcore.io.Posix.open(Native Method) 
11-14 13:29:23.711: W/System.err(14386): at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110) 
11-14 13:29:23.711: W/System.err(14386): at java.io.File.createNewFile(File.java:941) 
+0

你有清单中的<使用权限android:name =“android.permission.WRITE_EXTERNAL_STORAGE”/>吗? – kiruwka

+1

是的,它在那里。 – user3033922

回答

21

尝试改变

dir.mkdir(); 

dir.mkdirs(); 

也可以尝试只是路过dir代替dir.getAbsolutePath()

编辑

你也不想concatanate这样的文件路径。请尝试:

File myFile = new File(Environment.getExternalStorageDirectory(), "dir/savings.csv"); 
if (!myFile.exists()) { 
    myFile.mkdirs(); 
    myFile.createNewFile(); 
} 
+0

我试了两次你的建议没有运气。我试图在模拟器上运行它,如果有帮助的话。 – user3033922

+0

您是否已将SDCard支持添加到模拟器?转到eclipse - windows - avd管理器 - 选择AVD和编辑 - 硬件 - 新 - SDCard支持 – Brianjs

+0

好吧,所以我已经添加了一个SD卡到AVD后,我已经开始了AVD,我不想重新启动它...现在,当我点击按钮时LogCat中什么也没有显示,但我也无法在File Explorer中找到该文件。在mnt/sdcard之后似乎没有另一个目录。 – user3033922

9

在清单中添加此权限。

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

确实这是一个非常好的抓住!如果用户没有添加此权限,android系统将不允许用户写入,并且会发生相同的ENOENT错误。 –