文件流重命名文件

3
我正在尝试将文件作为filestream读取,重命名文件,并将文件以filestream形式发送到文档管理系统(DMS)。
我在StackOverflow上看到很多关于在c#中重命名文件的问题,大多数答案都建议使用File.Move。
然而,我想知道如果我不想实际重命名文件,而是想在文件变成filestream后重命名文件,是否有其他替代方案可供探索。我想探索File.Move之外的替代解决方案。
我尝试了以下方法来重命名文件,但是似乎filestream对象的name属性只读。
//This is my attempt
FileStream fs = new FileStream()
fs.Name = "new_name" //<-- not working

附加信息:

是的,我现在正试图修改一些没有适当文档记录的遗留代码,代码显示DMS库有一个参数可以将文件流对象传递给它并上传。因此,我假设DMS确实读取文件流的名称属性。

我希望直接更改文件流的名称的原因是我想尽可能少地更改,因为编写此代码的人已经离开,而且我也没有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(对于未接触过的人)? - TheGeneral
你的意思是 fs.Name 在你的代码中其他地方用于确定它在DMS中的名称吗? - ProgrammingLlama
2
@TheGeneral 我猜是“文档管理系统”。 - ProgrammingLlama
@John 对不起我使用了模糊的缩写,我以为人们会理解DMS代表“文档管理系统”。 - Matthew111
@Matthew111,在你的看法中,这是一个有用的目标吗?进行必要的更改。如果您正确地测试它们,记录它们并将它们作为单个、连贯的更改集提交到源代码控制中,以实现此特定要求,则更改内容并不重要。即使您按照我的建议去做,这也不是一个很大的改变,对吧?而且DMS根本看不出任何区别——它只会看到一个带名称的文件流。它不会知道您在发送之前将其重命名。 - ADyson
显示剩余4条评论
1个回答

2
如果您的文档管理系统(DMS)使用{{link1:FileStream.Name Property}}(这似乎很奇怪),那么您就没有办法改变它(容易)。
  • 您需要查看是否有覆盖方法来获取您的DMS调用中的文件名
  • 或在打开文件之前将其重命名

E.g

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年中,是否有任何变化可以使这个答案更好?谢谢! - Arvo Bowen
@ArvoBowen,据我所知,目前没有新的处理方式。请注意,对于第三方API的有限使用情况,这可能是合适的。尽管这在未来版本中可能会发生变化,但至少在Microsoft CLR的实现中不太可能发生变化。如果您要将其投入生产,请编写单元测试,这样您就可以更有信心地在发布到发布的基础上进行工作。 - TheGeneral
1
谢谢建议#1(我懒得打二进制)。 - Arvo Bowen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接