Skip to main content

Copy a directory recursive

Ultima oara cand a fost nevoie sa fac asa ceva a fost in timpul facultății. In seara asta aveam de lucru la un proiect ce se ocupa cu un deploy si supriza, aveam nevoie de acest mecanism. Speram ca .NET 4.0 sa fie plin de surprize, dar din pacate nu. Asa ca am inceput sa implementez de manuta si uite ce a iesit:
public static class DirectoryHelper
{
///
/// Copy recursive a directory to a specific location.
///

/// Source directory.
/// Destination directory.
public static void Copy(string sourceDirecotry, string destionationDirectory)
{
if (!Directory.Exists(destionationDirectory))
{
Directory.CreateDirectory(destionationDirectory);
}
//Copy all files from the current directory.
foreach (string file in Directory.GetFiles(sourceDirecotry))
{
var fileName=Path.GetFileName(file);
File.Copy(Path.Combine(destionationDirectory,fileName), Path.Combine(destionationDirectory, fileName));
}
//Copy files from the subfolders.
foreach (string folder in Directory.GetDirectories(sourceDirecotry))
{
var directoryName = Path.GetFileName(folder);
Copy(Path.Combine(destionationDirectory,directoryName), Path.Combine(destionationDirectory, directoryName));
}
}
}
M-am gandit si la o varianta LINQ, sa folosesc ForEach si expresii lambda, dar nu e la fel de rapid ca un foreach scris de mana. Un For ar fi si mai rapid, dar nu cred ca e cazul, prefer sa las codul sa fie cat mai usor de inteles. Avantajul la LINQ ar fi fost ca se poate scrie fara apeluri recursive( o sa revin maine si cu varianta aceasta).
Dezamagirea mea a fost in momentul in care am vrut sa il pun ca extension method la System.IO.Directory. Nu se poate asa ceva din cauza ca System.IO.Directory este o clasa statica. Asa ca trebe sa ne multumim cu clase helpere sau sa adaugam aceasta metoda ca extensie la DirectoryInfo.

Atentie, codul nu functioneaza daca unul din path-uri este subpath pentru celalat path. In cazul meu validarea pentru acest caz se face in alt loc.

Comments

Popular posts from this blog

ADO.NET provider with invariant name 'System.Data.SqlClient' could not be loaded

Today blog post will be started with the following error when running DB tests on the CI machine:
threw exception: System.InvalidOperationException: The Entity Framework provider type 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer' registered in the application config file for the ADO.NET provider with invariant name 'System.Data.SqlClient' could not be loaded. Make sure that the assembly-qualified name is used and that the assembly is available to the running application. See http://go.microsoft.com/fwlink/?LinkId=260882 for more information. at System.Data.Entity.Infrastructure.DependencyResolution.ProviderServicesFactory.GetInstance(String providerTypeName, String providerInvariantName) This error happened only on the Continuous Integration machine. On the devs machines, everything has fine. The classic problem – on my machine it’s working. The CI has the following configuration:

TeamCity.NET 4.51EF 6.0.2VS2013
It seems that there …

Entity Framework (EF) TransactionScope vs Database.BeginTransaction

In today blog post we will talk a little about a new feature that is available on EF6+ related to Transactions.
Until now, when we had to use transaction we used ‘TransactionScope’. It works great and I would say that is something that is now in our blood.
using (var scope = new TransactionScope(TransactionScopeOption.Required)) { using (SqlConnection conn = new SqlConnection("...")) { conn.Open(); SqlCommand sqlCommand = new SqlCommand(); sqlCommand.Connection = conn; sqlCommand.CommandText = ... sqlCommand.ExecuteNonQuery(); ... } scope.Complete(); } Starting with EF6.0 we have a new way to work with transactions. The new approach is based on Database.BeginTransaction(), Database.Rollback(), Database.Commit(). Yes, no more TransactionScope.
In the followi…

GET call of REST API that contains '/'-slash character in the value of a parameter

Let’s assume that we have the following scenario: I have a public HTTP endpoint and I need to post some content using GET command. One of the parameters contains special characters like “\” and “/”. If the endpoint is an ApiController than you may have problems if you encode the parameter using the http encoder.
using (var httpClient = new HttpClient()) { httpClient.BaseAddress = baseUrl; Task<HttpResponseMessage> response = httpClient.GetAsync(string.Format("api/foo/{0}", "qwert/qwerqwer"))); response.Wait(); response.Result.EnsureSuccessStatusCode(); } One possible solution would be to encode the query parameter using UrlTokenEncode method of HttpServerUtility class and GetBytes method ofUTF8. In this way you would get the array of bytes of the parameter and encode them as a url token.
The following code show to you how you could write the encode and decode methods.
publ…