C# FTP 上传文件 如何 使上传的文件的 创建、修改时间保持不变,还是上传之前的一样!
能否在FTP创建文件的时修改他的时间属性,使其保持不变!?
如果是你自己实现的 FTP 服务器,或者 FTP 服务器提供插件化方式允许你重写 WriteFile 方法的话,你可以自己编写代码在创建文件后重新设置它的属性。
FTP 服务器 是别人的 我只有单纯的写入权限! 能否在创建时就设置他的时间?
@暮色纯香: http://zhidao.baidu.com/question/450710673.html
你把这个读明白了,再把你的问题“能否在创建时就设置他的时间”阐述的明白点。
@Launcher:
谢谢你提供的支援!
不好意思是我没有理解明白,
别人提供一个FTP的路径我:我现在自己用C#写了一个服务 把log文件上传到别人提供给我的FTP的路径下,但文件过去后的时间 属性 都是我在上传时写入文件流的时间! 但这不是我想要的!
我想把它的时间属性修改掉(比如 创建时间、修改时间)
至于权限问题(我只有写入, 没有重写 权限)
假如我 有重写的权限、现在文件创建、修改时我都有 那么什么解决方案可以 修改 FTP上 某个文件的 时间属性(比如 创建时间、修改时间)?
谢谢!
下面附上 上传代码!
1 /// <summary> 2 /// 文件上传 3 /// </summary> 4 /// <param name="filename"></param> 5 public void Upload(string ftp_URL, string filename) 6 { 7 8 FileInfo fileInf = new FileInfo(filename); 9 10 string uri = ftp_URL + fileInf.Name; 11 12 13 14 Connect(uri);//连接 15 16 17 18 // 默认为true,连接不会被关闭 19 20 // 在一个命令之后被执行 21 22 reqFTP.KeepAlive = false; 23 24 25 26 // 指定执行什么命令 27 28 reqFTP.Method = WebRequestMethods.Ftp.UploadFile; 29 30 31 32 // 上传文件时通知服务器文件的大小 33 34 reqFTP.ContentLength = fileInf.Length; 35 36 37 38 // 缓冲大小设置为kb 39 40 int buffLength = 2048; 41 42 43 44 byte[] buff = new byte[buffLength]; 45 46 int contentLen; 47 48 49 // 打开一个文件流(System.IO.FileStream) 去读上传的文件 50 51 FileStream fs = fileInf.OpenRead(); 52 53 try 54 { 55 56 // 把上传的文件写入流 57 58 Stream strm = reqFTP.GetRequestStream(); 59 60 // 每次读文件流的kb 61 62 contentLen = fs.Read(buff, 0, buffLength); 63 64 // 流内容没有结束 65 66 while (contentLen != 0) 67 { 68 // 把内容从file stream 写入upload stream 69 70 strm.Write(buff, 0, contentLen); 71 contentLen = fs.Read(buff, 0, buffLength); 72 73 } 74 75 76 // 关闭两个流 77 strm.Close(); 78 fs.Close(); 79 } 80 catch (Exception ex) 81 { 82 //MessageBox.Show(ex.Message, "Upload Error"); 83 84 } 85 86 }
@暮色纯香: 我这么跟你说吧,假设你磁盘有个文件叫着 test.txt,大小为 1 个字节,其内容就包含一个字符 a ,你看它的属性,那不是写在 test.txt 中的,是记录在 OS 文件系统中的。你这段上传代码,实际上是把 a 读出来发给了服务器,服务器收到后,使用 CreateFile 在服务器的磁盘上新建一个文件,然后把 a 写入文件,至于你那些文件的属性它还留在你的客户端的机器上的 OS 文件系统中。
要让服务器存入的文件的属性跟你客户端文件的属性一致,你需要做下面的事情:
1、客户端上传文件内容之前,需要先读出本地文件的属性,并先将这些属性发送给服务器,然后再发送文件的内容;
2、服务器收到请求后,先 CreateFile 创建文件,然后 WriteFile 写入内容,然后使用从客户端收到的属性分别调用 SetFileTime,SetFileAttributes 修改新创建的文件的属性,让它和客户端的原文件的属性一致。
你这个FTP上传后,是保存在数据库吗?如果是用SQL控制下就好,不清楚你是用别人的应用还是什么,楼上说的更该FTP服务器的时间也是可取的,不过你可以试试更改你本地的时间看看能否得到自己想要的结果。
有一次发送邮件我改了本地的时间,耍了下小聪明。
谢谢你提供的 支援!
这样说吧 ! 别人提供一个FTP的路径我:我现在自己用C#写了一个服务 把log文件上传到别人提供给我的FTP的路径下,但文件过去后的时间 属性 都是我在上传时写入文件流的时间! 但这不是我想要的!
我想把它的时间属性修改掉(比如 创建时间、修改时间)
上传代码是网上查的一段代码
1 /// <summary> 2 /// 文件上传 3 /// </summary> 4 /// <param name="filename"></param> 5 public void Upload(string ftp_URL, string filename) 6 { 7 8 FileInfo fileInf = new FileInfo(filename); 9 10 string uri = ftp_URL + fileInf.Name; 11 12 13 14 Connect(uri);//连接 15 16 17 18 // 默认为true,连接不会被关闭 19 20 // 在一个命令之后被执行 21 22 reqFTP.KeepAlive = false; 23 24 25 26 // 指定执行什么命令 27 28 reqFTP.Method = WebRequestMethods.Ftp.UploadFile; 29 30 31 32 // 上传文件时通知服务器文件的大小 33 34 reqFTP.ContentLength = fileInf.Length; 35 36 37 38 // 缓冲大小设置为kb 39 40 int buffLength = 2048; 41 42 43 44 byte[] buff = new byte[buffLength]; 45 46 int contentLen; 47 48 49 // 打开一个文件流(System.IO.FileStream) 去读上传的文件 50 51 FileStream fs = fileInf.OpenRead(); 52 53 try 54 { 55 56 // 把上传的文件写入流 57 58 Stream strm = reqFTP.GetRequestStream(); 59 60 // 每次读文件流的kb 61 62 contentLen = fs.Read(buff, 0, buffLength); 63 64 // 流内容没有结束 65 66 while (contentLen != 0) 67 { 68 // 把内容从file stream 写入upload stream 69 70 strm.Write(buff, 0, contentLen); 71 contentLen = fs.Read(buff, 0, buffLength); 72 73 } 74 75 76 77 78 79 80 81 82 83 // 关闭两个流 84 strm.Close(); 85 fs.Close(); 86 } 87 catch (Exception ex) 88 { 89 //MessageBox.Show(ex.Message, "Upload Error"); 90 91 } 92 93 }
一楼已经说过了,FTP协议只是能传输文件的内容,不能传文件的属性。
在FTP协议下,客户端是无法直接修改服务器端的文件属性的, 除非服务器端提供接口,否则是做不到的。
其他几位对 FTP 的理解太狭隘了。
FTP 协议中有命令可以用来设置文件的最后修改时间,命令及格式:
MFMT YYYYMMDDHHMMSS filename