首页 新闻 会员 周边

C# FTP 上传文件 使文件的 创建、修改时间保持不变?????

0
悬赏园豆:20 [已解决问题] 解决于 2014-03-07 09:32

   C#   FTP 上传文件 如何 使上传的文件的 创建、修改时间保持不变,还是上传之前的一样!

   能否在FTP创建文件的时修改他的时间属性,使其保持不变!?

  

暮色纯香的主页 暮色纯香 | 初学一级 | 园豆:63
提问于:2014-02-28 12:54
< >
分享
最佳答案
0

如果是你自己实现的 FTP 服务器,或者 FTP 服务器提供插件化方式允许你重写 WriteFile 方法的话,你可以自己编写代码在创建文件后重新设置它的属性。

收获园豆:16
Launcher | 高人七级 |园豆:45045 | 2014-02-28 13:09

FTP 服务器 是别人的  我只有单纯的写入权限! 能否在创建时就设置他的时间?

暮色纯香 | 园豆:63 (初学一级) | 2014-02-28 15:00

@暮色纯香: http://zhidao.baidu.com/question/450710673.html

你把这个读明白了,再把你的问题“能否在创建时就设置他的时间”阐述的明白点。

Launcher | 园豆:45045 (高人七级) | 2014-02-28 15:11

@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         }
View Code

 

 
暮色纯香 | 园豆:63 (初学一级) | 2014-02-28 17:01

@暮色纯香: 我这么跟你说吧,假设你磁盘有个文件叫着 test.txt,大小为 1 个字节,其内容就包含一个字符 a ,你看它的属性,那不是写在 test.txt 中的,是记录在 OS 文件系统中的。你这段上传代码,实际上是把 a 读出来发给了服务器,服务器收到后,使用 CreateFile 在服务器的磁盘上新建一个文件,然后把 a 写入文件,至于你那些文件的属性它还留在你的客户端的机器上的 OS 文件系统中。

 

要让服务器存入的文件的属性跟你客户端文件的属性一致,你需要做下面的事情:

1、客户端上传文件内容之前,需要先读出本地文件的属性,并先将这些属性发送给服务器,然后再发送文件的内容;

2、服务器收到请求后,先 CreateFile 创建文件,然后 WriteFile 写入内容,然后使用从客户端收到的属性分别调用 SetFileTime,SetFileAttributes 修改新创建的文件的属性,让它和客户端的原文件的属性一致。

Launcher | 园豆:45045 (高人七级) | 2014-02-28 17:09
其他回答(3)
0

你这个FTP上传后,是保存在数据库吗?如果是用SQL控制下就好,不清楚你是用别人的应用还是什么,楼上说的更该FTP服务器的时间也是可取的,不过你可以试试更改你本地的时间看看能否得到自己想要的结果。

有一次发送邮件我改了本地的时间,耍了下小聪明。

收获园豆:2
雾静 | 园豆:561 (小虾三级) | 2014-02-28 16:13

谢谢你提供的 支援!

   这样说吧 !  别人提供一个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         }
View Code
支持(0) 反对(0) 暮色纯香 | 园豆:63 (初学一级) | 2014-02-28 16:54
0

一楼已经说过了,FTP协议只是能传输文件的内容,不能传文件的属性。

在FTP协议下,客户端是无法直接修改服务器端的文件属性的, 除非服务器端提供接口,否则是做不到的。

收获园豆:2
天方 | 园豆:5407 (大侠五级) | 2014-02-28 21:00
0

其他几位对 FTP 的理解太狭隘了。

FTP 协议中有命令可以用来设置文件的最后修改时间,命令及格式:

MFMT YYYYMMDDHHMMSS filename

printf("加油") | 园豆:202 (菜鸟二级) | 2015-12-20 21:42
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册