【问题标题】:File cannot be deleted文件无法删除
【发布时间】:2016-02-11 00:05:49
【问题描述】:

大家好,我正在编写一个服务器客户端程序,该程序将文件从客户端传输到服务器,有些文件不能被接受,我应该在测试后删除它们,但问题是 file.delete() 对我不起作用,因为得到一个错误,说文件在 java VM 中打开;

    package Serveur;

import java.io.DataInputStream;
import java.io.File;
import java.io.InputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.sql.SQLException;

public class Serveur {

    private static final int PORT =23456;
    private ServerSocket serverSkt = null;
    private Socket sock = null;
    private FileOutputStream fos = null;
    private boolean isStopped=false;

    private InputStream fis;
    private DataInputStream dis = null;

    private int idUtil=0;
    private String nomFichier = null;
    private int taille = 0; 

    public Serveur() throws ClassNotFoundException, SQLException{
        try {
            serverSkt = new ServerSocket(PORT);
            while(!isStopped){
                sock=serverSkt.accept();

                if(sock.isConnected()) {

                    fis=sock.getInputStream();

                    dis = new DataInputStream(fis);
                    idUtil=dis.readByte();
                    taille=dis.readInt();
                    nomFichier=dis.readUTF();

                    File fichier = new File("C:/Users/muddo/workspace/PFE/fichiers recu/"+nomFichier);
                    fos = new FileOutputStream(fichier);
                    byte[] bytes = new byte[taille];

                    int count=0;
                    while((count=dis.read(bytes)) > 0){
                        fos.write(bytes, 0, count);
                    }

                        dis.close();
                        fis.close();
                        fos.flush();
                        fos.close();
                        sock.close();

                        new max_allowed_packet();

                        String ext= fichier.getName().split("\\.")[1];

                        if(ext.equals("csv") || ext.equals("CSV") || ext.equals("Csv")){
                            TestCSV tc = new TestCSV(fichier.getAbsolutePath());
                            if(tc.test()==1){
                                new ChargerFichierCSV(fichier.getAbsolutePath());
                            }
                            else{
                                fichier.delete();
                            }
                        }
                        else {  
                            new ChargerFichier(fichier.getAbsolutePath(),idUtil);
                        }

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


    }

    public void arreterServeur() throws IOException{
        if(dis != null)
            dis.close();

        if(fis != null)
            fis.close();

        if(fos != null)
            fos.close();

        if(!sock.isClosed())
            sock.close();

        if(!serverSkt.isClosed())
            serverSkt.close();

        isStopped=true;
    }

}

【问题讨论】:

  • 问题出在 else{ fichier.delete(); }
  • 您确定在读/写文件时关闭文件吗?您将文件名传递给三个类TestCSVChargerFichierCSVChargerFichier
  • 这个dis.close(); fis.close(); fos.flush(); fos.close(); sock.close(); 太可怕了。使用try-with-resources。您的问题可能与资源处理不当有关。
  • 谢谢@Peter Lawrey,问题是我没有关闭 TestCSV 类中的文件,我修复了它,现在它正在工作

标签: java file input output


【解决方案1】:

服务器可能与拥有文件的用户以外的其他用户一起运行。你检查文件权限了吗??

 File fichier = new File("C:/Users/muddo/workspace/PFE/fichiers recu/"+nomFichier);

该文件由用户 muddo 所有,并且服务器可能在另一个具有较少权限的用户中运行。这似乎是个坏主意。您应该将共享文件放在共享文件夹中。或者授予服务器用户权限。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-08
    • 2011-11-03
    • 2014-02-07
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多