关于Java的FTP文件下载功能,求大神指教(附代码) 5C

最近在做一个FTP文件下载的功能,包括单个文件下载和打包文件下载,但是代码写出来以后经过各种调试测试,发现无论单个文件下载还是打包文件下载,都无法使用迅雷下载,只能使用浏览器进行下载,而且在下载的过程中不会显示进度条,但是文件下载下来的文件是很正常的。

//单个文件下载
 public void Ftpdownload(String reaName,String fileName,String remote,HttpServletResponse response,HttpServletRequest request) throws IOException 
      { 
          // 开启输出流弹出文件保存路径选择窗口 
        response.setContentType("application/octet-stream"); 
        response.setContentType("application/OCTET-STREAM;charset=UTF-8"); 
        //解决下载文件中文名称乱码的问题 
        String agent = request.getHeader("USER-AGENT");  
      if(agent != null && agent.toLowerCase().indexOf("firefox") > 0)
      {
          reaName = "=?UTF-8?B?" + (new String(Base64.encodeBase64(reaName.getBytes("UTF-8")))) + "?=";    
      }
      else
      {
          reaName =  java.net.URLEncoder.encode(reaName, "UTF-8");
      }
        response.setHeader("Content-Disposition", "attachment;filename=" +reaName); 
        OutputStream out = response.getOutputStream(); 
        // 转移到FTP服务器目录至指定的目录下
        ftpClient.changeWorkingDirectory(new String(remote.getBytes(LOCAL_CHARSET), SERVER_CHARSET));
        //下载FTP服务器指定文件
        ftpClient.retrieveFile(new String(fileName.getBytes(LOCAL_CHARSET), SERVER_CHARSET), out);
        out.close(); 
      } 
 //打包下载
 public void download(Map<String,String> map,String isbn,HttpServletResponse response){ 
          // 开启输出流弹出文件保存路径选择窗口 
        response.setContentType("application/octet-stream"); 
        response.setContentType("application/OCTET-STREAM;charset=UTF-8"); 
         //解决下载文件中文名称乱码的问题 
        try {
             SimpleDateFormat simpleDateFormat;  
             simpleDateFormat = new SimpleDateFormat("yyyyMMdd");  
             Date date = new Date();  
            String folderName=isbn+"-"+simpleDateFormat.format(date);
            response.setHeader("Content-Disposition", "attachment;filename=" +URLEncoder.encode(folderName+".zip", "UTF-8"));
        } catch (UnsupportedEncodingException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } 
        //设置缓存大小
        byte[] buffer = new byte[1024];  
        OutputStream out;
        try {
            out = response.getOutputStream();
            //开启压缩流
            ZipOutputStream zipout = new ZipOutputStream(out);
            int len; 
            FTPFile[] listFiles=ftpClient.listFiles();
            Set<String> set = map.keySet();  
            List<InputStream> list = new ArrayList<InputStream>();
            for (String key : set) {  
                // 转移到FTP服务器目录至指定的目录下
                ftpClient.changeWorkingDirectory(new String(map.get(key)
                        .getBytes(LOCAL_CHARSET), SERVER_CHARSET));


                String string = new String(key.getBytes(LOCAL_CHARSET),SERVER_CHARSET);
                //从FTP服务器下载文件到文件流
                InputStream retrieveFileStream = ftpClient
                        .retrieveFileStream(string);
                //标记为压缩包中内的一个新文件
                zipout.putNextEntry(new ZipEntry(key)); 
                //写入输出流
                while ((len = retrieveFileStream.read(buffer)) > 0) {    
                    zipout.write(buffer, 0, len);    
                }
                //关闭下载流
                retrieveFileStream.close(); 
                //FTP内置方法,必须调用才能下载下一个文件流
                ftpClient.completePendingCommand();
            } 
            //关闭压缩流
            zipout.close();  
        } catch (IOException e) {
            // TODO Auto-generated catch block 
            e.printStackTrace();
        } 
      } 

2个回答

选择迅雷下载的时候,控制台会报如下错

 org.apache.commons.net.io.CopyStreamException: IOException caught while copying.
    at org.apache.commons.net.io.Util.copyStream(Util.java:135)
    at org.apache.commons.net.ftp.FTPClient._retrieveFile(FTPClient.java:1800)
    at org.apache.commons.net.ftp.FTPClient.retrieveFile(FTPClient.java:1769)
    at com.snsoft.common.uitl.FtpUtils.download(FtpUtils.java:413)
    at com.snsoft.resource.controller.OCmsController.downloadPicture(OCmsController.java:548)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:777)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:706)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:868)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: ClientAbortException:  java.net.SocketException: Software caused connection abort: socket write error
    at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:413)
    at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:480)
    at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:366)
    at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:438)
    at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:426)
    at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:91)
    at org.apache.commons.net.io.Util.copyStream(Util.java:123)
    ... 44 more
Caused by: java.net.SocketException: Software caused connection abort: socket write error
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:153)
    at org.apache.coyote.http11.InternalOutputBuffer.realWriteBytes(InternalOutputBuffer.java:215)
    at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:480)
    at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:366)
    at org.apache.coyote.http11.InternalOutputBuffer$OutputStreamOutputBuffer.doWrite(InternalOutputBuffer.java:240)
    at org.apache.coyote.http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java:119)
    at org.apache.coyote.http11.AbstractOutputBuffer.doWrite(AbstractOutputBuffer.java:192)
    at org.apache.coyote.Response.doWrite(Response.java:517)
    at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:408)
    ... 50 more

FtpUtils.java: 413行报错,看看是什么

qq506121024
qq506121024 ftpClient.retrieveFile(new String(fileName.getBytes(LOCAL_CHARSET), SERVER_CHARSET), out);
大约 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
FTP下载文件损坏,求大神解答?

这个方法在我本机中的配置,下载可以,没有任何问题,部署在公司的测试环境中 下载文件就会损坏 @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String filename = request.getParameter("filename"); String fileNameNew=request.getParameter("fileNameNew"); // String fileNameNe = URLEncoder.encode(fileNameN, "UTF-8"); // String fileNameN=URLDecoder.decode(fileNameNe, "UTF-8"); // fileNameN= new String( // fileNameN.getBytes("ISO-8859-1"), // "UTF-8"); // String fileNameNew = fileNameN.replaceAll(" ", ""); InputStream inputStream=this.getClass().getClassLoader().getResourceAsStream("ftp.properties"); Properties prot=new Properties(); prot.load(inputStream); String hostName=prot.getProperty("ftp.ip"); String remoteDir=prot.getProperty("ftp.updir"); String userName=prot.getProperty("ftp.username"); String Pwd=prot.getProperty("ftp.pwd"); String prt=prot.getProperty("ftp.port"); // 初始表示下载失败 int port=Integer.parseInt(prt); // 创建FTPClient对象 FTPClient ftp = new FTPClient(); try { int reply; // 连接FTP服务器 // 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器 ftp.connect(hostName, port); reply = ftp.getReplyCode(); /* * 判断是否连接成功 */ if (!FTPReply.isPositiveCompletion(reply)) { ftp.disconnect(); } else{ // 登录ftp if (filename!=null && !filename.equals("")) { if(ftp.login(userName, Pwd)){ // 转到指定下载目录 ftp.changeWorkingDirectory(remoteDir); // 列出该目录下所有文件 FTPFile[] fs = ftp.listFiles(); // 遍历所有文件,找到指定的文件 for (FTPFile ff : fs) { if (ff.getName().equals(filename)) { // 根据绝对路径初始化文件 String name=new String(fileNameNew); response.setHeader("Content-Disposition","attachment; filename="+name); // 输出流 OutputStream is = response.getOutputStream(); response.setContentType("application/octet-stream"); // 下载文件 boolean success = ftp.retrieveFile(filename, is); System.out.println(success); is.flush(); is.close(); } } // 退出ftp ftp.logout(); // 下载成功 } } } } catch (IOException e) { e.printStackTrace(); } finally { if (ftp.isConnected()) { try { ftp.disconnect(); } catch (IOException ioe) { } } } }

java ftp 正在下载的文件使用后缀.tmp标记,下载完成后使用ftp上的文件名

各位大神,我想实现这样一个功能:使用java语言从ftp上下载文件,正在下载中的文件使用.tmp后缀标记,下载完成后使用.log.gz,ftp上的文件就是.log.gz文件,请问怎么实现,最好有代码。使用字符串拼接,还有下载完成重命名都试过了,不起作用。

java如何实现ftp文件的批量下载以及文件的移动

**FTP服务器下有两个文件夹:current、history** 1.如何实现下载FTP服务器current文件夹下的所有文件,并将current文件夹下的所有文件移动到history文件下。

java实现FTP远程文件的复制

程序运行在本机,FTP是一个Linux服务器。 想实现A文件夹中的文件复制到B文件夹(A与B都是FTP目录),不删除A目录的文件。 java怎么实现直接复制呢????

java 通过apache ftp读取大文件或者下载大文件

本人技术短,参照网上各位大侠的帖子写了登录ftp去读取ftp下面文件然后直接存进数据库的代码 ,但是我的代码只能读取一些小的文件,文件大点就报内存溢出.谁可以给个能在ftp上面下载大文件或者能够直接读取ftp服务器上面的大文件然后直接解析存进数据库的代码例子.不胜感激.

java操作FTP文件移动问题

公司要求把FTP上的文件读取完后移动到另一个文件中,我用了在网上查的ftpClient.rename没有反应,请各位大神支招

java中用ftp下载服务器上的文件,下载是自己电脑的路径,在本地跑,下载没有问题,真实环境就不行了

java中用ftp下载服务器上的文件,下载是自己电脑的路径,在本地跑,下载没有问题,真实环境就不行了,真实环境根本找不到路径? 如何解决啊~~~在线等~~~~~ public static File downloadFile( String url, //FTP服务器hostname int port,//FTP服务器端口 String username, //FTP登录账号 String password, //FTP登录密码 String path,//FTP服务器上的相对路径 String fileName,//要下载的文件名 String localPath,//下载后保存到本地的路径 String name//保存文件名 ) { boolean success = false; FTPClient ftp = new FTPClient(); int reply; try { ftp.connect(url, port); ftp.setDefaultPort(port); ftp.setControlEncoding("UTF-8"); ftp.connect(url, port);// 连接FTP服务器 ftp.login(username, password);// 登录 ftp.setFileType(FTP.BINARY_FILE_TYPE); reply = ftp.getReplyCode(); if (!FTPReply.isPositiveCompletion(reply)) { ftp.disconnect(); return null; } isDirExist(ftp, "/"+path); ftp.changeWorkingDirectory(path); ftp.enterLocalPassiveMode(); FTPFile[] fs = ftp.listFiles(); File localFile=null; for(FTPFile ff:fs){ if(ff.getName().equals(fileName)){ localFile= new File(localPath+"/"+name); OutputStream is = new FileOutputStream(localFile); ftp.retrieveFile(ff.getName(), is); is.close(); } } ftp.logout(); return localFile; } catch (IOException e) { e.printStackTrace(); } finally { if (ftp.isConnected()) { try { ftp.disconnect(); } catch (IOException ioe) { } } } return null; }

java FTP上传文件,成功上传,但是文件为空????

我再linux上面装了一个ftp,准备用程序上传文件到ftp 文件服务器上面, 上传是成功了,但是上传后的文件为空??我调试了发现storeFile这个方法一直返回false ![图片说明](https://img-ask.csdn.net/upload/201712/22/1513905346_255534.png) 但不知道怎么回事,求指教。。。 ``` /** * Description: 向FTP服务器上传文件 * @param host FTP服务器hostname * @param port FTP服务器端口 * @param username FTP登录账号 * @param password FTP登录密码 * @param basePath FTP服务器基础目录 * @param filePath FTP服务器文件存放路径。例如分日期存放:/2015/01/01。文件的路径为basePath+filePath * @param filename 上传到FTP服务器上的文件名 * @param input 输入流 * @return 成功返回true,否则返回false */ public static boolean uploadFile(String host, int port, String username, String password, String basePath, String filePath, String filename, InputStream input) { boolean result = false; FTPClient ftp = new FTPClient(); try { int reply; ftp.connect(host, port);// 连接FTP服务器 // 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器 ftp.login(username, password);// 登录 reply = ftp.getReplyCode(); if (!FTPReply.isPositiveCompletion(reply)) { ftp.disconnect(); return result; } //切换到上传目录 if (!ftp.changeWorkingDirectory(basePath+filePath)) { //如果目录不存在创建目录 String[] dirs = filePath.split("/"); String tempPath = basePath; for (String dir : dirs) { if (null == dir || "".equals(dir)) continue; tempPath += "/" + dir; if (!ftp.changeWorkingDirectory(tempPath)) { if (!ftp.makeDirectory(tempPath)) { return result; } else { ftp.changeWorkingDirectory(tempPath); } } } } //设置上传文件的类型为二进制类型 ftp.setFileType(FTP.BINARY_FILE_TYPE); //上传文件 if (!ftp.storeFile(new String(filename.getBytes("GBK"),"iso-8859-1"), input)) { return result; } input.close(); ftp.logout(); result = true; } catch (IOException e) { e.printStackTrace(); } finally { if (ftp.isConnected()) { try { ftp.disconnect(); } catch (IOException ioe) { } } } return result; } public static void main(String[] args) throws IOException { File file2=new File("D:\\Workspaces\\training\\web\\src\\main\\webapp\\modile\\Mission evaluation.docx"); FileInputStream input=new FileInputStream(file2); uploadFile("137.200.48.72", 21, "root", "123", "/home/files", "/Test/poc", "test.doc", input); input.close(); System.out.println(1); } ```

本地设置代理后,实现ftp文件下载

电脑上设置了代理。我在java程序中添加了这样的代码 InetSocketAddress addrproxy = new InetSocketAddress("代理服务器的ip", 8080); Proxy proxy = new Proxy(Proxy.Type.HTTP, addrproxy); URLConnection conn = new URL(ftp上文件的地址).openConnection(proxy); 这样可以正确下载文件。但是如果电脑不设置代理后,就会报错,407,无代理权限。 如果不用以上代码,在电脑上设置代理后,会提示无法链接ftp。由于公司的电脑既有设置代理的,也有不设置代理的。不知道怎么办。望大神们赐教

java 访问ftp读文件

项目中有一些数据信息必须存放在文件中,不存数据库,而且文件放在ftp服务器上,所以需要用到FtpClient读文件。 碰到问题如下: InputStream in = XXXXXX(通过ftpClient对象获取到输入流); byte[] buff = new byte[512]; int len = 0; while((len = in.read(buff)) != -1) { system.out.println("读取的长度: "+ len); } 假如文件流中一共有2036个字节,多次执行以上代码打印出来的结果会有两种 一: 512 512 512 500 二: 512 300 512 512 200 问题的意思就是情况2其中有一次读取会少于512个字节,是什么原因呢?情况一是想要的结果、但是多次运行以上代码,偶尔会出现情况二(比如执行10次出现2次) 急求解!!求帮忙

Linux ftp 下载文件需要权限

使用java下载ftp文件时,报错如下, ![图片说明](https://img-ask.csdn.net/upload/201805/19/1526659568_447688.png) 经过检验,并不是没有这个文件; 只是因为权限不够,我把这个文件权限给成777是可以的; 但是我不能在文件上传之后,想要下载的时候还得手动赋权限,这个有什么解决办法? 现在是可以上传的,网上好多答案都是针对上传,求助求助!!!

求教: java移动文件(移动ftp上的文件)

通过JAVA操作FTP上的文件(我用的是sun.net.ftp.FtpClient) 如:FTP上有目录A和目录B,现要将A目录中的文件移动到B目录,请问该怎么做? 第一次操作ftp上的文件,实在是太多不懂,还望各位指点一二,谢谢!!! 前面搜索了下,好像这位老兄liugj99跟我一样的问题,可是没有满意答案 [b]问题补充:[/b] 感谢lijie250,也非常感谢mickeymak,不过,这个只能处理本地文件吧。 能否再扩展一些,操作ftp上的文件?

Java从FTP下载xls文件,能下载成功,但是无法打开

这是我的代码 ``` FtpClient ftpClient = null; OutputStream os = null; FileInputStream is = null; public void connectServer(String ip, int port, String username,String password, String path){ try{/*连接服务器的两种方法*/ ftpClient = FtpClient.create(); try{ SocketAddress addr = new InetSocketAddress(ip,port); ftpClient.connect(addr); ftpClient.login(username, password.toCharArray()); System.out.println("登陆成功!"); if(path.length() != 0){ //吧远程系统上的目录切换到参数path所指定的目录 ftpClient.changeDirectory(path);// throws FtpProtocolException, IOException } }catch(FtpProtocolException e){ //TODO Auto-generated catch block e.printStackTrace(); System.out.println(0000000); } }catch(IOException ex){ ex.printStackTrace(); throw new RuntimeException(ex); } } public void download(String remoteFile,String localFile){ InputStream is = null; FileOutputStream fos = null; System.out.println(111111111); try{ ftpClient = FtpClient.create(); //获取远程机器上的文件filename,借助TelnetInputStream try{ is = ftpClient.getFileStream(remoteFile); }catch(FtpProtocolException e){ //TODO Auto-generated catch block e.printStackTrace(); } //File file_in = new File(localFile); fos = new FileOutputStream(localFile);//localFile 为内存输出流的输出对象 byte[] bytes = new byte[204800]; int c; while((c = is.read(bytes)) != -1){ fos.write(bytes, 0, c); } System.out.println("download success!"); }catch(IOException ex){ System.out.println("not download"); ex.printStackTrace(); throw new RuntimeException(ex); }finally{ try{ if(is != null){ is.close(); } }catch(IOException e){ e.printStackTrace(); }finally{ try{ if(fos != null){ fos.close(); } }catch(IOException e){ e.printStackTrace(); } } } } ``` 文件能下载下来但是不能打开,如图,不管点是还是否,都不能出来数据![图片说明](https://img-ask.csdn.net/upload/201501/21/1421806988_958734.png)

javaftp下载出现阻塞问题

用ftp下载时,执行到ftpClient.retrieveFile(fileName, os); 这个方法就卡死了,在网上找了很多方法也不行, ftpClient.enterLocalPassiveMode(); 加上主动被动都不行,跪求大神帮忙解决 ![图片说明](https://img-ask.csdn.net/upload/201803/12/1520865000_443356.png)

java+jsp读取FTP文件流,显示到jsp中

问题是这样的: 需要在jsp页面上显示图片,这个图片是存放在ftp上,即要从ftp上读取文件得到一个inputStream文件流(ftpClient.retrieveFileStream(filename))。如何把这个文件流,转化并显示到jsp页面,在jsp上如何获取这个转化后的流?<img>标签还是。。。?前台东西不太懂,系统哪位大神可以给出一个小的代码示例,后台的ftp那块不用给示例,只麻烦给从流到前台jsP的示例代码,谢谢各位!

window cmd 窗口ftp命令如何下载文件夹啊,用mget *只能下载文件,求大神解析

window cmd 窗口ftp命令如何下载文件夹啊,用mget * 只能下载文件,求大神解析

Java中使用FTPClient读取ftp文件过程中无法修改读取文件的文件名

使用FTPClient读取ftp上的某个txt文件内容,存到数据库,然后再加读取到的txt文件重命名,在重命名过程失败,代码如下 public void readAndInsert(){ LOGGER.info("开始读取各场景投诉类型并存入数据库"); //ftp配置信息读取 String host = ConfigUtil.getValue("zhzd.ftp.host"); String userName = ConfigUtil.getValue("zhzd.ftp.username"); String password = ConfigUtil.getValue("zhzd.ftp.password"); //ftp连接 FTPClient ftp = new FTPClient(); try { ftp.connect(host); ftp.login(userName,password); } catch (Exception e) { LOGGER.info("投诉工单类型:ftp连接异常..."); e.printStackTrace(); } //ftp文件读取 FTPFile[] files = null; String targetFileName = ""; //目标文件名 try { files = ftp.listFiles(); int length = files.length; int fileNum = 0; //txt文件个数 List<String> fileList = new ArrayList<String>(); //存储所有txt文件名 for(int i=0;i < length ;i++){ if(files[i].getName().contains("txt")){ fileList.add(files[i].getName()); fileNum++; }; } //ftp文件操作-获取目标文件,其他文件放入old文件夹 if(fileNum == 0){ //没有txt文件,不更新 LOGGER.info("投诉工单类型:FTP下没有txt文件..."); ftp.disconnect(); return; }else if(fileNum == 1){ //只有一个txt,不读取,不更新 LOGGER.info("投诉工单类型:FTP下只有一个txt文件,今日数据库不需更新..."); ftp.disconnect(); return; }else{ //两个或者多个,取日期最大的那个 int[] dateArr = new int[fileNum]; for(int i=0;i<fileNum;i++){ dateArr[i] = Integer.parseInt(fileList.get(i).split("_")[3].substring(0, 8)); } Arrays.sort(dateArr); //留下日期最大的文件,其余的都放入old文件夹 /***********************其他没有读取的文件可以重命名(rename)******************************/ for(int i=0;i<fileNum;i++){ if(fileList.get(i).contains(String.valueOf(dateArr[fileNum-1]))){ targetFileName = fileList.get(i); LOGGER.info("投诉工单类型:目标文件为{}...", targetFileName); fileList.remove(i); break; } } //移动文件 Iterator<String> it = fileList.iterator(); String backName = ""; while(it.hasNext()){ backName = it.next(); ftp.rename(backName,"old/"+backName); LOGGER.info("投诉工单类型:文件{}放入old文件夹...",backName); } } } catch (Exception e) { LOGGER.info("投诉工单类型:ftp文件列表读取异常..."); e.printStackTrace(); } //数据库操作 if(!"".equals(targetFileName)){ //删表 dnTimerDao.deleteSendType(); //读文件 InputStreamReader read = null; try { read = new InputStreamReader(ftp.retrieveFileStream(targetFileName),"GBK"); BufferedReader bufferedReader = new BufferedReader(read); String lineTxt = null; String[] str = null; while ((lineTxt = bufferedReader.readLine()) != null) { str = lineTxt.split(""); //存入数据库 if(str.length == 7){ dnTimerDao.insertSendType(str); }else{ throw new IOException("文件内容读取异常!"); } } read.close(); /*******************我用字符流读取的文件重命名失败,我将字符流、 字节流、输入流等都关闭了,也无法重命名*********************/ ftp.rename(targetFileName,"old/"+targetFileName); LOGGER.info("完成各场景投诉类型的读取和存入"); } catch (UnsupportedEncodingException e) { LOGGER.info("投诉工单类型:文件编码异常..."); e.printStackTrace(); } catch (IOException e) { LOGGER.info("投诉工单类型:文件内容的读取异常..."); e.printStackTrace(); } finally { if(read != null){ try { read.close(); } catch (IOException e) { e.printStackTrace(); } } try { ftp.disconnect(); } catch (IOException e) { e.printStackTrace(); } } } } }

java 读取FTP下的所有文件目录,以tree格式存入库

java 读取FTP下的所有文件目录,并一递归的方式组成tree的数据格式保存到数据库中?求大神告诉一下该怎么写。本人很菜,求帮助?

java关于从linux服务器里通过FTPClienet下载文件及文件夹的方法

新人菜鸟一枚,不会下载文件夹以及文件夹里的内容,求指导!现在自己只做到了文件的下载,但是文件夹不会,配置文件里写的是访问ftp服务器的ip,端口,用户名密码以及服务器的路径和下载后存放的位置路径。 import java.io.IOException; import java.net.SocketException; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPReply; import org.apache.log4j.Logger; public class FTPUtil { private static Logger logger = Logger.getLogger(FTPUtil.class); /** * 获取FTPClient对象 * * @param ftpHost * FTP主机服务器 * @param ftpPassword * FTP 登录密码 * @param ftpUserName * FTP登录用户名 * @param ftpPort * FTP端口 默认为21 * @return */ public static FTPClient getFTPClient(String ftpHost, String ftpPassword, String ftpUserName, int ftpPort) { FTPClient ftpClient = null; try { ftpClient = new FTPClient(); ftpClient.connect(ftpHost,ftpPort);// 连接FTP服务器 ftpClient.login(ftpUserName, ftpPassword);// 登陆FTP服务器 if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) { // ftpClient.getReplyCode()返回的内容是答复的客户端代码 //logger.info("未连接到FTP,用户名或密码错误。"); System.out.println("未连接到FTP,用户名或密码错误。"); ftpClient.disconnect(); } else { System.out.println("FTP连接成功。"); } } catch (SocketException e) { e.printStackTrace(); System.out.println("FTP的IP地址可能错误,请正确配置。"); } catch (IOException e) { e.printStackTrace(); System.out.println("FTP的端口错误,请正确配置。"); } return ftpClient; } } ---------------------------------------------------------------- import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.SocketException; import java.util.Properties; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPClientConfig; import org.apache.commons.net.ftp.FTPReply; public class DownloadFileFromRmote { private static boolean downloadFileFromRmote(String ftpHost, Integer ftpPort, String ftpUserName, String ftpPassword, String ftpPath, String fileName, String writeTempFielPath) { boolean flag = false; FTPClient ftpClient = new FTPClient(); FileOutputStream fos = null; try { ftpClient.connect(ftpHost, ftpPort); ftpClient.login(ftpUserName, ftpPassword); int reply; reply = ftpClient.getReplyCode(); // 230 if (!FTPReply.isPositiveCompletion(reply)) { ftpClient.disconnect(); return flag; } File localFile = new File(writeTempFielPath + File.separator + fileName);// G:\测试路径\1.png if (!localFile.exists()) { localFile.createNewFile(); } ftpClient.setBufferSize(1024); ftpClient.setControlEncoding("UTF-8"); // 设置文件类型(二进制) ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); fos = new FileOutputStream(localFile); System.out.println(fos); ftpClient.retrieveFile(fileName, fos); flag = true; } catch (SocketException e) { System.out.println("连接失败!"); e.printStackTrace(); } catch (IOException e) { System.out.println("下载失败!"); e.printStackTrace(); } finally { try { if (fos != null) { fos.close(); } if (ftpClient.isConnected()) { ftpClient.disconnect(); } } catch (IOException e) { System.out.println("下载失败!"); e.printStackTrace(); } } return flag; } public static void main(String[] args) { int ftpPort = 0; String ftpHost = ""; String ftpUserName = ""; String ftpPassword = ""; String ftpPath = "";// FTP路径 String fileName = ""; String writeTempFielPath = ""; try { InputStream in = FTPUtil.class.getClassLoader() .getResourceAsStream("env.properties"); if (in == null) { System.out.println("配置文件env.properties读取失败"); } else { Properties properties = new Properties(); properties.load(in); ftpUserName = properties.getProperty("ftpUserName"); // 从属性文件里获取用户密码 ftpPassword = properties.getProperty("ftpPassword"); ftpHost = properties.getProperty("ftpHost"); ftpPort = Integer.valueOf(properties.getProperty("ftpPort")) .intValue(); // 端口 ftpPath = properties.getProperty("ftpPath"); fileName = properties.getProperty("fileName"); writeTempFielPath = properties.getProperty("writeTempFielPath"); System.out.println(ftpUserName + "" + ftpPassword + "" + ftpHost + "" + ftpPort + "" + ftpPort + "" + ftpPath); downloadFileFromRmote(ftpHost, ftpPort, ftpUserName, ftpPassword, ftpPath, fileName, writeTempFielPath); } } catch (Exception e) { e.printStackTrace(); } } }

定量遥感中文版 梁顺林著 范闻捷译

这是梁顺林的定量遥感的中文版,由范闻捷等翻译的,是电子版PDF,解决了大家看英文费时费事的问题,希望大家下载看看,一定会有帮助的

Java 最常见的 200+ 面试题:面试必备

这份面试清单是从我 2015 年做了 TeamLeader 之后开始收集的,一方面是给公司招聘用,另一方面是想用它来挖掘在 Java 技术栈中,还有那些知识点是我不知道的,我想找到这些技术盲点,然后修复它,以此来提高自己的技术水平。虽然我是从 2009 年就开始参加编程工作了,但我依旧觉得自己现在要学的东西很多,并且学习这些知识,让我很有成就感和满足感,那所以何乐而不为呢? 说回面试的事,这份面试...

机器学习初学者必会的案例精讲

通过六个实际的编码项目,带领同学入门人工智能。这些项目涉及机器学习(回归,分类,聚类),深度学习(神经网络),底层数学算法,Weka数据挖掘,利用Git开源项目实战等。

远程工具,免费

远程工具,免费

java jdk 8 帮助文档 中文 文档 chm 谷歌翻译

JDK1.8 API 中文谷歌翻译版 java帮助文档 JDK API java 帮助文档 谷歌翻译 JDK1.8 API 中文 谷歌翻译版 java帮助文档 Java最新帮助文档 本帮助文档是使用谷

csma/ca和csma/cd的matlab仿真源代码带有详细的注释

csma/ca和csma/cd的matlab仿真源代码带有详细的注释,载波侦听,随意设置节点数,带有炫酷的图形展示效果。

Java基础知识面试题(2020最新版)

文章目录Java概述何为编程什么是Javajdk1.5之后的三大版本JVM、JRE和JDK的关系什么是跨平台性?原理是什么Java语言有哪些特点什么是字节码?采用字节码的最大好处是什么什么是Java程序的主类?应用程序和小程序的主类有何不同?Java应用程序与小程序之间有那些差别?Java和C++的区别Oracle JDK 和 OpenJDK 的对比基础语法数据类型Java有哪些数据类型switc...

软件测试入门、SQL、性能测试、测试管理工具

软件测试2小时入门,让您快速了解软件测试基本知识,有系统的了解; SQL一小时,让您快速理解和掌握SQL基本语法 jmeter性能测试 ,让您快速了解主流来源性能测试工具jmeter 测试管理工具-禅道,让您快速学会禅道的使用,学会测试项目、用例、缺陷的管理、

pokemmo的资源

pokemmo必须的4个rom 分别为绿宝石 火红 心金 黑白 还有汉化补丁 资源不错哦 记得下载

三个项目玩转深度学习(附1G源码)

从事大数据与人工智能开发与实践约十年,钱老师亲自见证了大数据行业的发展与人工智能的从冷到热。事实证明,计算机技术的发展,算力突破,海量数据,机器人技术等,开启了第四次工业革命的序章。深度学习图像分类一直是人工智能的经典任务,是智慧零售、安防、无人驾驶等机器视觉应用领域的核心技术之一,掌握图像分类技术是机器视觉学习的重中之重。针对现有线上学习的特点与实际需求,我们开发了人工智能案例实战系列课程。打造:以项目案例实践为驱动的课程学习方式,覆盖了智能零售,智慧交通等常见领域,通过基础学习、项目案例实践、社群答疑,三维立体的方式,打造最好的学习效果。

无线通信中的智能天线:IS-95和第3代CDMA应用_.pdf

无线通信中的智能天线:IS-95和第3代CDMA应用_.pdf

设计模式(JAVA语言实现)--20种设计模式附带源码

课程亮点: 课程培训详细的笔记以及实例代码,让学员开始掌握设计模式知识点 课程内容: 工厂模式、桥接模式、组合模式、装饰器模式、外观模式、享元模式、原型模型、代理模式、单例模式、适配器模式 策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式 课程特色: 笔记设计模式,用笔记串连所有知识点,让学员从一点一滴积累,学习过程无压力 笔记标题采用关键字标识法,帮助学员更加容易记住知识点 笔记以超链接形式让知识点关联起来,形式知识体系 采用先概念后实例再应用方式,知识点深入浅出 提供授课内容笔记作为课后复习以及工作备查工具 部分图表(电脑PC端查看):

Java8零基础入门视频教程

这门课程基于主流的java8平台,由浅入深的详细讲解了java SE的开发技术,可以使java方向的入门学员,快速扎实的掌握java开发技术!

玩转Linux:常用命令实例指南

人工智能、物联网、大数据时代,Linux正有着一统天下的趋势,几乎每个程序员岗位,都要求掌握Linux。本课程零基础也能轻松入门。 本课程以简洁易懂的语言手把手教你系统掌握日常所需的Linux知识,每个知识点都会配合案例实战让你融汇贯通。课程通俗易懂,简洁流畅,适合0基础以及对Linux掌握不熟练的人学习; 【限时福利】 1)购课后按提示添加小助手,进答疑群,还可获得价值300元的编程大礼包! 2)本月购买此套餐加入老师答疑交流群,可参加老师的免费分享活动,学习最新技术项目经验。 --------------------------------------------------------------- 29元=掌握Linux必修知识+社群答疑+讲师社群分享会+700元编程礼包。 &nbsp;

极简JAVA学习营第四期(报名以后加助教微信:eduxy-1)

想学好JAVA必须要报两万的培训班吗? Java大神勿入 如果你: 零基础想学JAVA却不知道从何入手 看了一堆书和视频却还是连JAVA的环境都搭建不起来 囊中羞涩面对两万起的JAVA培训班不忍直视 在职没有每天大块的时间专门学习JAVA 那么恭喜你找到组织了,在这里有: 1. 一群志同道合立志学好JAVA的同学一起学习讨论JAVA 2. 灵活机动的学习时间完成特定学习任务+每日编程实战练习 3. 热心助人的助教和讲师及时帮你解决问题,不按时完成作业小心助教老师的家访哦 上一张图看看前辈的感悟: &nbsp; &nbsp; 大家一定迫不及待想知道什么是极简JAVA学习营了吧,下面就来给大家说道说道: 什么是极简JAVA学习营? 1. 针对Java小白或者初级Java学习者; 2. 利用9天时间,每天1个小时时间; 3.通过 每日作业 / 组队PK / 助教答疑 / 实战编程 / 项目答辩 / 社群讨论 / 趣味知识抢答等方式让学员爱上学习编程 , 最终实现能独立开发一个基于控制台的‘库存管理系统’ 的学习模式 极简JAVA学习营是怎么学习的? &nbsp; 如何报名? 只要购买了极简JAVA一:JAVA入门就算报名成功! &nbsp;本期为第四期极简JAVA学习营,我们来看看往期学员的学习状态: 作业看这里~ &nbsp; 助教的作业报告是不是很专业 不交作业打屁屁 助教答疑是不是很用心 &nbsp; 有奖抢答大家玩的很嗨啊 &nbsp; &nbsp; 项目答辩终于开始啦 &nbsp; 优秀者的获奖感言 &nbsp; 这是答辩项目的效果 &nbsp; &nbsp; 这么细致的服务,这么好的氛围,这样的学习效果,需要多少钱呢? 不要1999,不要199,不要99,只要9.9 是的你没听错,只要9.9以上所有就都属于你了 如果你: 1、&nbsp;想学JAVA没有基础 2、&nbsp;想学JAVA没有整块的时间 3、&nbsp;想学JAVA没有足够的预算 还等什么?赶紧报名吧,抓紧抢位,本期只招300人,错过只有等时间待定的下一期了 &nbsp; 报名请加小助手微信:eduxy-1 &nbsp; &nbsp;

Python数据清洗实战入门

本次课程主要以真实的电商数据为基础,通过Python详细的介绍了数据分析中的数据清洗阶段各种技巧和方法。

董付国老师Python全栈学习优惠套餐

购买套餐的朋友可以关注微信公众号“Python小屋”,上传付款截图,然后领取董老师任意图书1本。

linux下利用/proc进行进程树的打印

在linux下利用c语言实现的进程树的打印,主要通过/proc下的目录中的进程文件,获取status中的进程信息内容,然后利用递归实现进程树的打印

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

HoloLens2开发入门教程

本课程为HoloLens2开发入门教程,讲解部署开发环境,安装VS2019,Unity版本,Windows SDK,创建Unity项目,讲解如何使用MRTK,编辑器模拟手势交互,打包VS工程并编译部署应用到HoloLens上等。

150讲轻松搞定Python网络爬虫

【为什么学爬虫?】 &nbsp; &nbsp; &nbsp; &nbsp;1、爬虫入手容易,但是深入较难,如何写出高效率的爬虫,如何写出灵活性高可扩展的爬虫都是一项技术活。另外在爬虫过程中,经常容易遇到被反爬虫,比如字体反爬、IP识别、验证码等,如何层层攻克难点拿到想要的数据,这门课程,你都能学到! &nbsp; &nbsp; &nbsp; &nbsp;2、如果是作为一个其他行业的开发者,比如app开发,web开发,学习爬虫能让你加强对技术的认知,能够开发出更加安全的软件和网站 【课程设计】 一个完整的爬虫程序,无论大小,总体来说可以分成三个步骤,分别是: 网络请求:模拟浏览器的行为从网上抓取数据。 数据解析:将请求下来的数据进行过滤,提取我们想要的数据。 数据存储:将提取到的数据存储到硬盘或者内存中。比如用mysql数据库或者redis等。 那么本课程也是按照这几个步骤循序渐进的进行讲解,带领学生完整的掌握每个步骤的技术。另外,因为爬虫的多样性,在爬取的过程中可能会发生被反爬、效率低下等。因此我们又增加了两个章节用来提高爬虫程序的灵活性,分别是: 爬虫进阶:包括IP代理,多线程爬虫,图形验证码识别、JS加密解密、动态网页爬虫、字体反爬识别等。 Scrapy和分布式爬虫:Scrapy框架、Scrapy-redis组件、分布式爬虫等。 通过爬虫进阶的知识点我们能应付大量的反爬网站,而Scrapy框架作为一个专业的爬虫框架,使用他可以快速提高我们编写爬虫程序的效率和速度。另外如果一台机器不能满足你的需求,我们可以用分布式爬虫让多台机器帮助你快速爬取数据。 &nbsp; 从基础爬虫到商业化应用爬虫,本套课程满足您的所有需求! 【课程服务】 专属付费社群+每周三讨论会+1v1答疑

MySQL 8.0.19安装教程(windows 64位)

话不多说直接开干 目录 1-先去官网下载点击的MySQL的下载​ 2-配置初始化的my.ini文件的文件 3-初始化MySQL 4-安装MySQL服务 + 启动MySQL 服务 5-连接MySQL + 修改密码 先去官网下载点击的MySQL的下载 下载完成后解压 解压完是这个样子 配置初始化的my.ini文件的文件 ...

Python数据挖掘简易入门

&nbsp; &nbsp; &nbsp; &nbsp; 本课程为Python数据挖掘方向的入门课程,课程主要以真实数据为基础,详细介绍数据挖掘入门的流程和使用Python实现pandas与numpy在数据挖掘方向的运用,并深入学习如何运用scikit-learn调用常用的数据挖掘算法解决数据挖掘问题,为进一步深入学习数据挖掘打下扎实的基础。

深度学习原理+项目实战+算法详解+主流框架(套餐)

深度学习系列课程从深度学习基础知识点开始讲解一步步进入神经网络的世界再到卷积和递归神经网络,详解各大经典网络架构。实战部分选择当下最火爆深度学习框架PyTorch与Tensorflow/Keras,全程实战演示框架核心使用与建模方法。项目实战部分选择计算机视觉与自然语言处理领域经典项目,从零开始详解算法原理,debug模式逐行代码解读。适合准备就业和转行的同学们加入学习! 建议按照下列课程顺序来进行学习 (1)掌握深度学习必备经典网络架构 (2)深度框架实战方法 (3)计算机视觉与自然语言处理项目实战。(按照课程排列顺序即可)

网络工程师小白入门--【思科CCNA、华为HCNA等网络工程师认证】

本课程适合CCNA或HCNA网络小白同志,高手请绕道,可以直接学习进价课程。通过本预科课程的学习,为学习网络工程师、思科CCNA、华为HCNA这些认证打下坚实的基础! 重要!思科认证2020年2月24日起,已启用新版认证和考试,包括题库都会更新,由于疫情原因,请关注官网和本地考点信息。题库网络上很容易下载到。

Ubuntu18.04安装教程

Ubuntu18.04.1安装一、准备工作1.下载Ubuntu18.04.1 LTS2.制作U盘启动盘3.准备 Ubuntu18.04.1 的硬盘空间二、安装Ubuntu18.04.1三、安装后的一些工作1.安装输入法2.更换软件源四、双系统如何卸载Ubuntu18.04.1新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列...

sql语句 异常 Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your

在我们开发的工程中,有时候会报 [Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ------ 这种异常 不用多想,肯定是我们的sql语句出现问题,下面...

西南交通大学新秀杯数学建模试题

题目比较难,如果符合大家的口味欢迎大家下载哈,提高你的思维想象能力

Windows版YOLOv4目标检测实战:训练自己的数据集

课程演示环境:Windows10; cuda 10.2; cudnn7.6.5; Python3.7; VisualStudio2019; OpenCV3.4 需要学习ubuntu系统上YOLOv4的同学请前往:《YOLOv4目标检测实战:训练自己的数据集》 课程链接:https://edu.csdn.net/course/detail/28745 YOLOv4来了!速度和精度双提升! 与 YOLOv3 相比,新版本的 AP (精度)和 FPS (每秒帧率)分别提高了 10% 和 12%。 YOLO系列是基于深度学习的端到端实时目标检测方法。本课程将手把手地教大家使用labelImg标注和使用YOLOv4训练自己的数据集。课程实战分为两个项目:单目标检测(足球目标检测)和多目标检测(足球和梅西同时检测)。 本课程的YOLOv4使用AlexyAB/darknet,在Windows系统上做项目演示。包括:安装软件环境、安装YOLOv4、标注自己的数据集、整理自己的数据集、修改配置文件、训练自己的数据集、测试训练出的网络模型、性能统计(mAP计算)和先验框聚类分析。还将介绍改善YOLOv4目标检测性能的技巧。 除本课程《Windows版YOLOv4目标检测实战:训练自己的数据集》外,本人将推出有关YOLOv4目标检测的系列课程。请持续关注该系列的其它视频课程,包括: 《Windows版YOLOv4目标检测实战:人脸口罩佩戴检测》 《Windows版YOLOv4目标检测实战:中国交通标志识别》 《Windows版YOLOv4目标检测:原理与源码解析》

Spring Boot -01- 快速入门篇(图文教程)

Spring Boot -01- 快速入门篇 今天开始不断整理 Spring Boot 2.0 版本学习笔记,大家可以在博客看到我的笔记,然后大家想看视频课程也可以到【慕课网】手机 app,去找【Spring Boot 2.0 深度实践】的课程,令人开心的是,课程完全免费! 什么是 Spring Boot? Spring Boot 是由 Pivotal 团队提供的全新框架。Spring Boot...

相关热词 c#框体中的退出函数 c# 按钮透明背景 c# idl 混编出错 c#在位置0处没有任何行 c# 循环给数组插入数据 c# 多线程死锁的例子 c# 钉钉读取员工排班 c# label 不显示 c#裁剪影像 c#工作进程更新ui
立即提问