【发布时间】:2021-01-19 19:11:59
【问题描述】:
我遇到了复制文件/目录的问题。几乎整天都在挣扎。 我必须从根目录文件及其带有文件和子目录的目录复制。 事实上,我已经做了一些事情。但是,每次我运行时都会出现stackoverflow错误。
abstract class SystemOperations {
public virtual void SearchFiles() { }
public virtual void SearchDirectories() { }
public abstract void CreateDirectory(string DIR);
public abstract void CloneContent(string DIR);
public abstract void CreateJSON(string DIR);
public void ExecuteCopying(string DIR) {
CreateDirectory(DIR);
CloneContent(DIR);
CreateJSON(DIR);
}
}
class FileOperations : SystemOperations {
DirectoryInfo _MainPath;
public DirectoryInfo MainPath {
get { return _MainPath; }
set { _MainPath = value; }
}
public FileOperations(DirectoryInfo MainPath) {
this.MainPath = MainPath;
}
#region Unnecessary for current task
public override void SearchFiles() {
string path = "";
FileInfo[] files = MainPath.GetFiles();
foreach (FileInfo file in files) {
path = file.Name;
}
}
public override void SearchDirectories() {
string path = "";
DirectoryInfo[] directories = MainPath.GetDirectories();
foreach (DirectoryInfo directory in directories) {
path = directory.Name;
}
}
#endregion
public override void CreateDirectory(string DIR) {
string newFolder = Path.Combine(MainPath + "", DIR);
Directory.CreateDirectory(newFolder);
}
public override void CloneContent(string DIR) {
foreach (var directory in Directory.GetDirectories(MainPath + "")) {
string dir = Path.GetFileName(directory);
CloneContent(Path.Combine(MainPath + "", dir));
}
foreach (var file in Directory.GetFiles(MainPath + "")) {
File.Copy(file, Path.Combine(MainPath + "", Path.GetFileName(file)), true);
}
}
public override void CreateJSON(string DIR) {
if (!Directory.Exists(DIR)) {
var asd = new DirectoryInfo(DIR);
}
}
}
class Program {
static void Main() {
SystemOperations task = new FileOperations(new DirectoryInfo(@"D:\\LAK"));
task.ExecuteCopying("COPY");
}
}
因此,函数 CloneContent 必须复制到每个 dir/subdirs 文件中。但是它的递归函数,正如我上面写的,我遇到了错误。而且不知道如何解决这个问题。谢谢你!
【问题讨论】:
-
当使用递归时,你需要一个 break out 子句。必须有一个你不递归的场景。这是一个示例:geeksforgeeks.org/program-for-nth-fibonacci-number。在这种情况下,如果输入的值小于 2,则退出函数。
-
foreach (var directory in Directory.GetDirectories(MainPath + ""))应该是...GetDirectories(DIR)) -
你的
Search...函数没有意义,它们什么都不做。MainPath + ""与MainPath相同。_mainPath也可以通过使其成为自动属性来删除。 -
@Charlieface 不,
MainPath + ""与MainPath.ToString()相同(MainPath是DirectoryInfo实例)。但是应该注意the documentation 声明应该使用FullName属性。 -
@Charlieface
MainPath不是字符串。这是一个DirectoryInfo对象。如果你要做Directory.GetDirectories(MainPath),你会得到一个编译错误。你需要做Directory.GetDirectories(MainPath.FullName)或Directory.GetDirectories(MainPath.ToString())或像他们那样做Directory.GetDirectories(MainPath + "")。更好的是,因为它是一个DirectoryInfo对象:MainPath.GetDirectories()
标签: c# system.io.file