2012-04-26 4 views
0

Я использую Directory.GetFiles для поиска файлов, которые будут скопированы. Мне нужно найти пути к файлам, чтобы я мог использовать копию, но я понятия не имею, как найти путь. Итерирует файлы в порядке, но я не могу их скопировать или переместить, потому что мне нужен исходный путь файла.Пути из массива дерева каталогов

Это то, что у меня есть:

string[] files = Directory.GetFiles(sourcePath, "*.*", SearchOption.AllDirectories); 

System.Console.WriteLine("Files Found"); 

// Display all the files. 
foreach (string file in files) 
{ 
    string extension = Path.GetExtension(file); 
    string thenameofdoom = Path.GetFileNameWithoutExtension(file); 
    string filename = Path.GetFileName(file); 

    bool b = false; 
    string newlocation = (@"\\TEST12CVG\Public\Posts\Temporaryjunk\"); 

    if (extension == ".pst" || 
    extension == ".tec" || 
    extension == ".pas" || 
    extension == ".snc" || 
    extension == ".cst") 
    { 
    b = true; 
    } 

    if (thenameofdoom == "Plasma" || 
    thenameofdoom == "Oxygas" || 
    thenameofdoom == "plasma" || 
    thenameofdoom == "oxygas" || 
    thenameofdoom == "Oxyfuel" || 
    thenameofdoom == "oxyfuel") 
    { 
    b = false; 
    } 

    if (b == true) 
    { 
    File.Copy(file, newlocation + thenameofdoom); 
    System.Console.WriteLine("Success: " + filename); 
    b = false; 
    } 
} 
+0

Он имеет больше, но я ставлю то, что было необходимо до мне это нужно для моей работы, над которой я работаю, и мне нужно скорее, чем позже. – shred1894

+0

Вы имеете в виду 'Path.GetDirectoryName (filename)'? – mellamokb

+0

Мне нужен весь путь, а не только папка, в которой находится файл. – shred1894

ответ

1

Path.GetFullPath работы, но также рассмотреть возможность использования FileInfo, как это происходит со многими вспомогательными методами файл.

Я хотел бы использовать метод, подобный этому (можно использовать гораздо больше обработки ошибок (попробуйте уловы ...), но это хорошее начало

EDIT Я заметил, что вы отфильтровывать расширения, но требуя от них, обновление кода позволяет для этого

class BackupOptions 
{ 
    public IEnumerable<string> ExtensionsToAllow { get; set; } 
    public IEnumerable<string> ExtensionsToIgnore { get; set; } 
    public IEnumerable<string> NamesToIgnore { get; set; } 
    public bool CaseInsensitive { get; set; } 

    public BackupOptions() 
    { 
    ExtensionsToAllow = new string[] { }; 
    ExtensionsToIgnore = new string[] { }; 
    NamesToIgnore = new string[] { }; 
    } 
} 

static void Backup(string sourcePath, string destinationPath, BackupOptions options = null) 
{ 

    if (options == null) 
    optionns = new BackupOptions(); 

    string[] files = Directory.GetFiles(sourcePath, ".", SearchOption.AllDirectories); 
    StringComparison comp = options.CaseInsensitive ? StringComparison.CurrentCultureIgnoreCase : StringComparison.CurrentCulture; 

    foreach (var file in files) 
    { 
    FileInfo info = new FileInfo(file); 

    if (options.ExtensionsToAllow.Count() > 0 && 
     !options.ExtensionsToAllow.Any(allow => info.Extension.Equals(allow, comp))) 
     continue; 

    if (options.ExtensionsToIgnore.Any(ignore => info.Extension.Equals(ignore, comp))) 
     continue; 

    if (options.NamesToIgnore.Any(ignore => info.Name.Equals(ignore, comp))) 
     continue; 

    try 
    { 
     File.Copy(info.FullName, destinationPath + "\\" + info.Name); 
    } 
    catch (Exception ex) 
    { 
     // report/handle error 
    } 
    } 
} 

с вызовом, как:.

var options = new BackupOptions 
{ 
    ExtensionsToAllow = new string[] { ".pst", ".tec", ".pas", ".snc", ".cst" }, 
    NamesToIgnore = new string[] { "Plasma", "Oxygas", "Oxyfuel" }, 
    CaseInsensitive = true 
}; 

Backup("D:\\temp", "D:\\backup", options); 
+0

Файлы находятся на сервере, и они будут помещены на другой сервер, я думаю, что eric сказал мне, что работает (это не исключение по какой-либо причине, кроме разрешений), у него есть проблема с правами доступа, которую мне придется сортировать. нет ничего, чем действительно нужно для обработки ошибок. – shred1894

+0

@ shred1894 Path.GetDirectoryName (файл) не лучше кода, который я предоставил. Работа с путями UNC, то есть '\\ имя_сервера \ ...' не имеет значения для кода, этот код будет работать так же хорошо. В любом работоспособном решении, которое вы выбрали, вашему процессу потребуются соответствующие разрешения на чтение и запись, даже независимо от локальных или удаленных файлов. – payo

+0

@ shred1894 Обратите внимание, что я использую 'FileInfo', поскольку у него есть много полезных вспомогательных методов, чтобы легко получить пути и имена и расширения. – payo

Смежные вопросы