关于文件复制的问题

haifeng39 2010-05-06 11:19:36
从一个文件夹下复制所有的文件到目标位置(比如D:\C#),在复制文件的时候如果目标磁盘已满的话如何把剩下的文件复制到另一个磁盘?(如果复制到一半D盘满了的话自动把剩下的文件复制到E:\C#下面)请问该怎么实现呢,请高手不吝赐教。
...全文
133 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
铛铛 2010-05-07
  • 打赏
  • 举报
回复
剩余空间比较一下大小 如果比剩余空间小 就拷 拷完后再把剩余大小减去你当前已经拷过的文件大小 如果比剩余空间大 那么就说明不能再往里面拷东西了 就拷到新路径中去
这里你还可以优化一下 例如 你再可以用一个变量来保存你文件夹
pei2lala 2010-05-07
  • 打赏
  • 举报
回复
可以这样做呀 copy之前 先得到剩余磁盘大小 比如是250m
然后把这个数字保存起来
再接着循环你要复制的文件夹
在拷之前先和剩余空间比较一下大小 如果比剩余空间小 就拷 拷完后再把剩余大小减去你当前已经拷过的文件大小 如果比剩余空间大 那么就说明不能再往里面拷东西了 就拷到新路径中去
这里你还可以优化一下 例如 你再可以用一个变量来保存你文件夹中最小的文件 当剩余磁盘大小小于你的最少文件的时候 你就不用再去判断了 直接拷到新盘中就行了
PeterSong9970 2010-05-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 haifeng39 的回复:]
没人关注,自己顶。
[/Quote]
我帮你顶一下
haifeng39 2010-05-07
  • 打赏
  • 举报
回复
没人关注,自己顶。
haifeng39 2010-05-07
  • 打赏
  • 举报
回复
11楼方法不错,我先试试。谢谢!
lester19872007 2010-05-06
  • 打赏
  • 举报
回复
这个就好像你要在你的电脑上安装一款软件一样,在安装之前都会检查你的磁盘控件是否充足,如果不足是不会让你进行下一步的,所以在你进行复制之前,先判断一下你要复制的文件有多大,要复制到的目录空间是否足够。。。
皇城龙三 2010-05-06
  • 打赏
  • 举报
回复
2楼说的对,这样拷贝会丢失,需要事先判断

你可以先获得磁盘的剩余空间:

using System.Runtime.InteropServices;

[DllImport("kernel32.dll")]
public static extern bool GetDiskFreeSpaceEx(
string lpDirectoryName,
out UInt64 lpFreeBytesAvailable,
out UInt64 lpTotalNumberOfBytes,
out UInt64 lpTotalNumberOfFreeBytes);

ulong freeBytesAvailable = 0;
ulong totalNumberOfBytes = 0;
ulong totalNumberOfFreeBytes = 0;

GetDiskFreeSpaceEx(
"c:\\",
out freeBytesAvailable,
out totalNumberOfBytes,
out totalNumberOfFreeBytes);


然后提取文件夹的大小:

引入System.IO这个命名空间



public static long GetDirectoryLength(string dirPath)
{
//判断给定的路径是否存在,如果不存在则退出
if (!Directory.Exists(dirPath))
return 0;
long len = 0;

//定义一个DirectoryInfo对象
DirectoryInfo di = new DirectoryInfo(dirPath);

//通过GetFiles方法,获取di目录中的所有文件的大小
foreach (FileInfo fi in di.GetFiles())
{
len += fi.Length;
}

//获取di中所有的文件夹,并存到一个新的对象数组中,以进行递归
DirectoryInfo[] dis = di.GetDirectories();
if (dis.Length > 0)
{
for (int i = 0; i < dis.Length; i++)
{
len += GetDirectoryLength(dis[i].FullName);
}
}
return len;
}


最后对这两个值作比较

判断是否执行拷贝动作
gnimgnot 2010-05-06
  • 打赏
  • 举报
回复
对。同意2楼。
复制前判断文件源与目的地的大小
feelxym 2010-05-06
  • 打赏
  • 举报
回复
捕获磁盘已满错误再重新拷贝

string[] sFileNameList = { "", "", "", "" };
string sTempFileName = sFileNameList[0];
string sDir = @"e:\";
int i = 1;
while (sTempFileName != "")
{
try
{
File.Copy(@"d:\" + sTempFileName, sDir + sTempFileName);
if (i < sFileNameList.Length)
{
sTempFileName = sFileNameList[i];
i++;
}
else
{
sTempFileName = "";
}
}
catch (FieldAccessException ex)
{
File.Delete(sDir + sTempFileName);
if (ex.Message == "磁盘已满[未测试过磁盘已满的错误是什么,自己调试可获得]")
{
sDir = @"f:\";
}
}
}
lester19872007 2010-05-06
  • 打赏
  • 举报
回复
这样复制文件容易丢失数据。。你为什么不在复制前判断一下磁盘空间呢?
haifeng39 2010-05-06
  • 打赏
  • 举报
回复
小弟知道怎么复制文件,但对这个问题觉得很棘手,请高手给个思路。
haifeng39 2010-05-06
  • 打赏
  • 举报
回复
感谢楼上几位的回复!

之所以这样做是因为 比如客户的电脑有10G的可用空间,C盘d盘各5G,要复制的文件也是10G,我是想在复制的时候程序会自动往C盘拷5G然后D盘拷5G ,而不是要客户自己手动腾出10个G的空间。

110,524

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧