Всем привет!
Кто-нибудь может сказать как копировать диреткорию со всем ее содержимым?
public void CopyFolder(System.String path)
{
DirectoryInfo di = new DirectoryInfo(m_Dirname);
FileSystemInfo [] dirs = di.GetFileSystemInfos();
DirectoryInfo newdi = new DirectoryInfo(path);
}
а вот как дальше делать не подскажете?
As long as there is life, there is hope
копирование директории
От:
Аноним
Дата:
07.07.05 10:49
Оценка:
Есть два варианта:
1. Надо рекурсивно обходить директории и копировать файлы поштучно.
2. Подключить COM — библиотеку Microsoft Scripting Runtime и использовать:
Scripting.FileSystemObjectClass file_system_object = new Scripting.FileSystemObjectClass();
Scripting.Folder folder = file_system_object.GetFolder(source_folder_name);
folder.Copy(destination_folder_name);
Здравствуйте, Virus Quartirus, Вы писали:
VQ>Есть два варианта: VQ>1. Надо рекурсивно обходить директории и копировать файлы поштучно. VQ>2. Подключить COM — библиотеку Microsoft Scripting Runtime и использовать:
VQ>Scripting.FileSystemObjectClass file_system_object = new Scripting.FileSystemObjectClass(); VQ>Scripting.Folder folder = file_system_object.GetFolder(source_folder_name); VQ>folder.Copy(destination_folder_name);
Вот пример с рекурсией
public void CopyFolder(string src,string dist)
{
if(!Directory.Exists(dist))
Directory.CreateDirectory(dist);
FileInfo file;
DirectoryInfo dir;
string[] strFiles;
string[] strDirs;
//Copy all files...
strFiles = Directory.GetFiles(m_Dirname);
foreach (string strFile in strFiles)
{
file = new FileInfo(strFile);
file.CopyTo(dist+"\\"+file.Name);
}
//Copy child directories...
strDirs = Directory.GetDirectories(src);
foreach (string strDir in strDirs)
{
dir = new DirectoryInfo(strDir);
if(dir.FullName == dist)//check to prevent infinite loop if the destination is under the source folder..
continue;
CopyFolder(dir.FullName,dist+"\\"+dir.Name);
}
}
Здравствуйте, Sorantis, Вы писали:
S>Кто-нибудь может сказать как копировать диреткорию со всем ее содержимым?
S>а вот как дальше делать не подскажете?
Тут ответах приводили пример с рекурсией. Можно то же самое без рекурсии, с использованием динамического массива для списка необработанных папок.
Писано на VB.NET для .NET 1.1, проверено — работает:
Private Sub CopyFolder(ByVal SourceDirName As String, ByVal DestDirName As String)
Dim Folders As New ArrayList
'поместить целевой каталог в очередь для обработки
Folders.Add(New FolderPair(SourceDirName, DestDirName))
Do While True'выйти, если больше нет каталогов для обработкиIf Folders.Count = 0 Then Exit Do'взять каталог для обработкиDim pair As FolderPair = CType(Folders(0), FolderPair)
Folders.RemoveAt(0)
'создать каталог
Directory.CreateDirectory(pair.DestFolder)
'скопировать файлыDim FileName, sDest As String, okSkipFile As Boolean
For Each FileName In Directory.GetFiles(pair.SrcFolder)
sDest = Path.Combine(pair.DestFolder, Path.GetFileName(FileName))
okSkipFile = False
If File.Exists(sDest) Then
If Not Alert.YesNo(Me, "Файл уже существует:" & vbCrLf & vbCrLf & sDest & vbCrLf & vbCrLf & "Заменить его?") Then _
okSkipFile = True
End If
If Not okSkipFile Then
File.Copy(FileName, sDest, True)
End If
Next'поместить подкаталоги в очередь на обработкуDim FolderName As String
For Each FolderName In Directory.GetDirectories(pair.SrcFolder)
Folders.Add(New FolderPair(FolderName, Path.Combine(pair.DestFolder, Path.GetFileName(FolderName))))
Next
Loop
End Sub
Private Class FolderPair
Friend SrcFolder As String
Friend DestFolder As String
Sub New(ByVal SrcFolder As String, ByVal DestFolder As String)
Me.SrcFolder = SrcFolder
Me.DestFolder = DestFolder
End Sub
End Class
Здравствуйте, nzeemin, Вы писали:
N>Здравствуйте, Sorantis, Вы писали:
S>>Кто-нибудь может сказать как копировать диреткорию со всем ее содержимым?
S>>а вот как дальше делать не подскажете?
N>Тут ответах приводили пример с рекурсией. Можно то же самое без рекурсии, с использованием динамического массива для списка необработанных папок.
А зачем?
Re[3]: на VB.NET без рекурсии
От:
Аноним
Дата:
18.11.07 03:59
Оценка:
N>>Тут ответах приводили пример с рекурсией. Можно то же самое без рекурсии, с использованием динамического массива для списка необработанных папок. ___>А зачем?
Разные способы обхода графа есть все-таки...
Здравствуйте, Аноним, Вы писали:
N>>>Тут ответах приводили пример с рекурсией. Можно то же самое без рекурсии, с использованием динамического массива для списка необработанных папок. ___>>А зачем? А>Разные способы обхода графа есть все-таки...
Разные способы есть. Конечно, штаны можно через ноги одевать, а можно через голову — но зачем?
Здравствуйте, _d_m_, Вы писали:
___>Здравствуйте, nzeemin, Вы писали:
N>>Здравствуйте, Sorantis, Вы писали:
S>>>Кто-нибудь может сказать как копировать диреткорию со всем ее содержимым?
S>>>а вот как дальше делать не подскажете?
N>>Тут ответах приводили пример с рекурсией. Можно то же самое без рекурсии, с использованием динамического массива для списка необработанных папок.
___>А зачем?
Здравствуйте, Ватакуси, Вы писали:
N>>>Тут ответах приводили пример с рекурсией. Можно то же самое без рекурсии, с использованием динамического массива для списка необработанных папок.
___>>А зачем?
В>Ресурсы берегуться.
Здравствуйте, _d_m_, Вы писали:
___>Здравствуйте, Ватакуси, Вы писали:
N>>>>Тут ответах приводили пример с рекурсией. Можно то же самое без рекурсии, с использованием динамического массива для списка необработанных папок.
___>>>А зачем?
В>>Ресурсы берегуться.
___> И много сберегается?
пусть у вас каждый вызов занимает в стеке 1 Кб (не знаю правда что вы там будете на килобайт хранить) — итого получается нужен стек размером 1 МБ — выглядит вполне реально.
а вот что вы будете хранить в такой структуре директорий ? да и как их создавать ?
Здравствуйте, Ватакуси, Вы писали:
N>>>>>Тут ответах приводили пример с рекурсией. Можно то же самое без рекурсии, с использованием динамического массива для списка необработанных папок.
___>>>>А зачем?
В>>>Ресурсы берегуться.
___>> И много сберегается?
В>Ну, скажем на 1000 уровней вниз, твоя рекурсия раскрутится? Стек выдержит?
Во первых, не моя, а общая. Во вторых, стек выдержит (надо использовать крепкий, качественный стек ). В третьих, к примеру, если мне надо записать пару слов на бумаге я использую шариковую ручку, а не типографский станок.
Здравствуйте, Ватакуси, Вы писали: В>Ну, скажем на 1000 уровней вниз, твоя рекурсия раскрутится? Стек выдержит?
А ты сам не в силах оценить размер фрейма стека для функции копирования директории?
По моим прикидкам, он влазит в 32 байта. Для превышения дефолтного размера стека нужно обеспечить глубину рекурсии в ~32000.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, Ватакуси, Вы писали: В>>Ну, скажем на 1000 уровней вниз, твоя рекурсия раскрутится? Стек выдержит? S>А ты сам не в силах оценить размер фрейма стека для функции копирования директории? S>По моим прикидкам, он влазит в 32 байта. Для превышения дефолтного размера стека нужно обеспечить глубину рекурсии в ~32000.
А что все в мире ограничивается примитивами? А если там с учетом прав NTSF (+ проверка на соответсвие полноты и непротиворечивости оных) нужно копировать, с дополнительной фильтрацией и т.п.? Боюсь даже в 64 байта не влезет :D
Здравствуйте, Ватакуси, Вы писали: В>А что все в мире ограничивается примитивами? А если там с учетом прав NTSF (+ проверка на соответсвие полноты и непротиворечивости оных) нужно копировать, с дополнительной фильтрацией и т.п.? Боюсь даже в 64 байта не влезет :D
А ты померь. Даже если ты сумеешь наколбасить стек фрейм размером в 64 байта (проверкой прав на NTFS тут не обойдешься), то все равно потребуется глубина в 16000. У тебя часто встречаются такие структуры файлухи?
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.