C# 有关文件处理

Posted 突破自我

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 有关文件处理相关的知识,希望对你有一定的参考价值。

一、移动文件夹内容,含子文件 参照:http://www.ayjs.net/post/300.html

/// <summary>
        /// 移动文件夹内容
        /// </summary>
        /// <param name="source"></param>
        /// <param name="target">目标</param>
        public static void MoveDirectory(string source, string target)
        {
            var sourcePath = source.TrimEnd(\'\\\\\', \' \');
            var targetPath = target.TrimEnd(\'\\\\\', \' \');
            var files = Directory.EnumerateFiles(sourcePath, "*", SearchOption.AllDirectories)
                                 .GroupBy(s => Path.GetDirectoryName(s));
            foreach (var folder in files)
            {
                var targetFolder = folder.Key.Replace(sourcePath, targetPath);
                Directory.CreateDirectory(targetFolder);
                foreach (var file in folder)
                {
                    var targetFile = Path.Combine(targetFolder, Path.GetFileName(file));
                    if (File.Exists(targetFile)) File.Delete(targetFile);
                    File.Move(file, targetFile);
                }
            }
            Directory.Delete(source, true);
        }

二、文件和文件夹类DirectoryInfo、FileInfo 参照:https://www.cnblogs.com/skylaugh/archive/2012/09/23/2698850.html

C#遍历指定文件夹中的所有文件
DirectoryInfo TheFolder=new DirectoryInfo(folderFullName);
//遍历文件夹
foreach(DirectoryInfo NextFolder in TheFolder.GetDirectories())
   this.listBox1.Items.Add(NextFolder.Name);
//遍历文件
foreach(FileInfo NextFile in TheFolder.GetFiles())
   this.listBox2.Items.Add(NextFile.Name);

===================================================================

如何获取指定目录包含的文件和子目录
    1. DirectoryInfo.GetFiles():获取目录中(不包含子目录)的文件,返回类型为FileInfo[],支持通配符查找;
    2. DirectoryInfo.GetDirectories():获取目录(不包含子目录)的子目录,返回类型为DirectoryInfo[],支持通配符查找;
    3. DirectoryInfo. GetFileSystemInfos():获取指定目录下(不包含子目录)的文件和子目录,返回类型为FileSystemInfo[],支持通配符查找;
如何获取指定文件的基本信息;
    FileInfo.Exists:获取指定文件是否存在;
    FileInfo.Name,FileInfo.Extensioin:获取文件的名称和扩展名;
    FileInfo.FullName:获取文件的全限定名称(完整路径);
    FileInfo.Directory:获取文件所在目录,返回类型为DirectoryInfo;
    FileInfo.DirectoryName:获取文件所在目录的路径(完整路径);
    FileInfo.Length:获取文件的大小(字节数);
    FileInfo.IsReadOnly:获取文件是否只读;
    FileInfo.Attributes:获取或设置指定文件的属性,返回类型为FileAttributes枚举,可以是多个值的组合
    FileInfo.CreationTime、FileInfo.LastAccessTime、FileInfo.LastWriteTime:分别用于获取文件的创建时间、访问时间、修改时间;

 

需要有关如何使用 C# 从 MIME 文件中获取附件的帮助/建议

【中文标题】需要有关如何使用 C# 从 MIME 文件中获取附件的帮助/建议【英文标题】:Need help / advice on how to get attachments out of a MIME file using C# 【发布时间】:2014-11-09 12:54:33 【问题描述】:

我有 MIME 格式的文件。我需要保存这些文件中的附件。不涉及电子邮件。我可以找到很多关于如何将附件添加到电子邮件或 MIME 文件的示例,但很少有关于如何将它们删除的示例。我查看了几个 MIME 解析器,例如 LimiLabs 和一个来自 SASA 的解析器。但他们没有显示我正在寻找的样本。而且我太初学者了,无法从他们拥有的少量文档中理解它们。那么,这甚至可能吗?我需要使用 3rd 方项目还是仅使用 .NET 即可完成?

MIME-Version: 1.0
Content-Type: multipart/related;boundary="IGi2rPe3RHug37'6b21FU)yg.3tkE/l5r0e-l+ZXD8qh,-P:"

--IGi2rPe3RHug37'6b21FU)yg.3tkE/l5r0e-l+ZXD8qh,-P:
Content-type: text/xml; charset="UTF-8"
Content-id: ACCOUNT

<?xml version="1.0" encoding="utf-8"?>
<ACCOUNT>
    <CustId>
       <CustPermId>ivan</CustPermId>
       <CustLoginId>smaher</CustLoginId>
    </CustId>
</ACCOUNT>

--IGi2rPe3RHug37'6b21FU)yg.3tkE/l5r0e-l+ZXD8qh,-P:
Content-type: image/jpeg
Content-id: CLOCK.JPG
Content-description: Notice of Cancellation


[Base64 Encoded Data Here]
--IGi2rPe3RHug37'6b21FU)yg.3tkE/l5r0e-l+ZXD8qh,-P:--

【问题讨论】:

你有没有偶然在网上搜索过这个......?实际上有很多例子 我真的有。最后2天!要么我不擅长搜索,要么只是不知道我在寻找什么。我还应该补充一点,这些 MIME 消息将包含多个附件。 用谷歌搜索这个C# get attacments from mime怎么样 做到了。这可能是我尝试的第一件事。我知道那里有很多东西。但这一切都与电子邮件有关。我看到的大多数代码示例都围绕着这一点展开。关于保存多个附件的发现很少。 我经常在发送文件附件时这样做,我可以在有空的时候更详细地查看这个.. 【参考方案1】:

我不知道 .NET Framework 中有任何内置的 MIME 解析器,您必须使用第三方组件或使用 CDOSYS(Microsoft CDO for Windows 2000)。后者是一个 COM 组件,随任何比 Windows 2000 更新的 Windows 版本一起提供。它是一个古老的东西,因此依赖它并不完全是面向未来的,但它现在可用并且可以工作。

要使用 CDOSYS,只需添加对该库和 ADODB 的 COM 引用,然后使用以下代码加载和解析电子邮件:

CDO.Message msg = new CDO.Message();

// load MIME into CDO
using (FileStream stream = new FileStream(emailFileSpec, FileMode.Open))

    // read file into a byte stream
    byte[] emailData = new byte[stream.Length];
    stream.Read(emailData, 0, (int)stream.Length);

    // load byte stream data into an ADODB stream for CDO
    ADODB.Stream stm = new ADODB.Stream();
    stm.Open(
        System.Reflection.Missing.Value,
        ADODB.ConnectModeEnum.adModeUnknown,
        ADODB.StreamOpenOptionsEnum.adOpenStreamUnspecified,
        null, null);
    stm.Type = ADODB.StreamTypeEnum.adTypeBinary;
    stm.Write(emailData);
    stm.Flush();
    stm.SetEOS();

    // attach data source to the CDO object
    msg.DataSource.OpenObject(stm, "_Stream");
    stm.Close();

这只是一个例子,代码可以简化为File.ReadAllBytes()

加载电子邮件后,您可以通过IMessage interface 的Attachment 属性访问附件(即CDO.Message)。每个附件都是一个实现 IBodyPart 接口的对象。使用GetDecodedContentStream() 方法将解码的内容加载到ADODB.Stream 中,您可以将其读入.NET 字节数组。示例:

// get decoded data into an ADODB stream
ADODB.Stream stm = part.GetDecodedContentStream();

// cast to COM IStream and load into byte array
IStream comStream = (IStream)stm;
byte[] attachmentData = new byte[stm.Size];
comStream.Read(attachmentData, stm.Size, IntPtr.Zero);

HTH。

【讨论】:

感谢您的回复。我出车祸了,所以我要过几天才能试一试。但我不想让你认为我忽略了它。 @JimDel:呃,我希望没什么大不了的——没必要在这里着急。 谢谢!沿着这些方向进行的更多研究让我解决了问题。

以上是关于C# 有关文件处理的主要内容,如果未能解决你的问题,请参考以下文章

记录C#常用的代码片段

如何为 XSLT 代码片段配置 CruiseControl 的 C# 版本?

你如何在 python 中处理 graphql 查询和片段?

C#处理Json格式文件的源码演示

C# 最有用的(自定义)代码片段是啥? [关闭]

c#代码片段快速构建代码