【问题标题】:Filestream renaming file文件流重命名文件
【发布时间】:2018-10-25 07:40:28
【问题描述】:

我正在尝试将文件作为文件流读取,重命名文件,并将文件以文件流的形式发送到文档管理系统 (DMS)。

我在 StackOverflow 中看到很多关于在 c# 中重命名文件的问题,并且大部分回复都建议使用 File.Move 。

但是,我想知道如果不想实际重命名文件,我想在文件成为文件流后重命名为文件。我想探索 File.Move 以外的替代解决方案。

我尝试通过以下方法重命名文件,但是,文件流对象的名称属性似乎是只读的。

//This is my attempt
FileStream fs = new FileStream()
fs.Name = "new_name" //<-- not working

附加信息:

是的,我现在正在尝试修改一些没有适当文档的遗留代码,其中代码显然表明 DMS 的库有一个参数可以将文件流对象传递给它并上传。因此,我假设 DMS 确实读取了文件流的 Name 属性。

我之所以要直接更改文件流的名称是因为我想至少尽可能地更改,因为编写此代码的人已经走了,而且我也没有DMS的文档。另外,文件上传完成后会保存,这也是我不想改文件名的原因。

//This is how the actual program code looked like
FileStream input = File.OpenRead(uploadFile_path);
obj.Update();
obj.Fetch();

但是听了大家的建议后,我认为解决这个问题最安全的方法是:

  1. 创建文件的副本
  2. 重命名文件副本
  3. 上传文件的文件流
  4. 删除文件

【问题讨论】:

  • 什么是DMS(对于初学者)
  • 您的意思是fs.Name 在您的代码中的其他地方用于确定其在 DMS 中的名称吗?
  • @TheGeneral 我猜是“文档管理系统”
  • @John 哦,我明白了!
  • 具有潜在意外结果的不安全方式,并且在未来的 .NET 实现/其他 .NET 实现(例如 Mono)中会有所不同:使用反射来设置私有 _filename 字段的值。安全方式:将其包装在带有所需 DMS 名称的对象中。另一种安全方法:将文件复制到具有新名称的临时位置,完成后将其删除。

标签: c# file filestream


【解决方案1】:

如果您的文档管理系统(显然是 DMS)正在使用 FileStream.Name Property(至少可以说这看起来很奇怪),那么您很不走运,这无法(轻松地)更改。

  • 您必须查看是否有覆盖以在 DMS 调用中获取文件名
  • 或者在打开之前重命名

例如

System.IO.File.Move("oldfilename", "newfilename");

或者因为这是stackoverflow,你可以用反射设置名称

注意:我不建议这样做,这可能会随着 .net 的未来版本而改变,谁知道你可能会遇到什么问题,但它确实可以改变名称属性

// some FileStream 
FileStream file = new FileStream(@"D:\test.txt", FileMode.Open);

var myField = file.GetType()
                  .GetField( "_fileName", BindingFlags.Instance | BindingFlags.NonPublic)

// set the name
myField.SetValue(file, "blah");

【讨论】:

  • 对你的警告我很犹豫是否使用这种方法。但是,我需要这样做!我有一个我不想打扰的文件(各种原因,只读访问,我只是希望源文件中的所有内容都保持不变。但是,显然这个文件流/字节数组最终会忽略元数据并检查实际的文件名。所以我需要在内存中获取文件,更改内存中的名称,然后将其转换为字节数组。在~2.5 年内有什么改变可以使这个答案更好吗?谢谢!
  • @ArvoBowen 不,据我所知,没有新的方法来处理这个问题。请注意,对于 3rd 方 api 的有限用例,这可能是合适的。尽管这种 can 在未来版本中的更改不太可能 to 至少随着 Microsoft 的 CLR 实现而发生更改。如果这要投入生产,我建议你做的就是为它编写单元测试,至少这样你就会更有信心这是在一个发布到发布的基础上工作
  • 感谢您的建议 #1(我懒得尝试输入二进制文件)。
猜你喜欢
  • 1970-01-01
  • 2014-09-09
  • 2014-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-20
  • 1970-01-01
  • 2011-04-24
相关资源
最近更新 更多