<?xml version="1.0"?><?xml-stylesheet type="text/xsl" href="/rss.xsl"?><rss version="2.0"><channel><title>SharePoint 2010 Bulk Document Importer</title><link>http://spbulkdocumentimport.codeplex.com/project/feeds/rss</link><description>Need to import&amp;#47;migrate files and folders from servers and network shares into SharePoint 2010 document libraries&amp;#63;   This free commandline application helps you get the job done&amp;#33;  Ideal for one-time migration of a large number of documents into SharePoint 2010.</description><item><title>New Post: ERROR - The document library does not exist </title><link>http://spbulkdocumentimport.codeplex.com/discussions/264166</link><description>&lt;div style="line-height: normal;"&gt;Did anyone figgure out if you can import files into sub folders of a document library ?&lt;br /&gt;
&lt;/div&gt;</description><author>JPPowers</author><pubDate>Thu, 16 May 2013 20:54:55 GMT</pubDate><guid isPermaLink="false">New Post: ERROR - The document library does not exist  20130516085455P</guid></item><item><title>Closed Issue: Add support for claims authentication w/ windows [6963]</title><link>http://spbulkdocumentimport.codeplex.com/workitem/6963</link><description>It would be great to have support for claims authentication using the NT Token provider. Attempting an import with this configuration currently results in a 403 as the client attempts to redirect to the windows authentication based login page.&lt;br /&gt;&amp;#160;&lt;br /&gt;This blog post explains what&amp;#39;s involved&amp;#58; &lt;br /&gt;http&amp;#58;&amp;#47;&amp;#47;blogs.technet.com&amp;#47;b&amp;#47;speschka&amp;#47;archive&amp;#47;2010&amp;#47;06&amp;#47;04&amp;#47;using-the-client-object-model-with-a-claims-based-auth-site-in-sharepoint-2010.aspx&lt;br /&gt;&amp;#160;&lt;br /&gt;Thanks&lt;br /&gt;</description><author>melg</author><pubDate>Thu, 16 May 2013 10:40:12 GMT</pubDate><guid isPermaLink="false">Closed Issue: Add support for claims authentication w/ windows [6963] 20130516104012A</guid></item><item><title>Closed Issue: import fails after renaming a document library [7068]</title><link>http://spbulkdocumentimport.codeplex.com/workitem/7068</link><description>After renaming a document library the program incorrectly tries to save files to an url containing the new name.&lt;br /&gt;</description><author>melg</author><pubDate>Thu, 16 May 2013 10:40:12 GMT</pubDate><guid isPermaLink="false">Closed Issue: import fails after renaming a document library [7068] 20130516104012A</guid></item><item><title>Closed Issue: -CreateEmptyFolders flag condition is not implemented. [7130]</title><link>http://spbulkdocumentimport.codeplex.com/workitem/7130</link><description>Tried using the exe and searching the source, this flag&amp;#47;option does not seem to be implemented.&lt;br /&gt;&amp;#160;&lt;br /&gt;FYI.&lt;br /&gt;</description><author>melg</author><pubDate>Thu, 16 May 2013 10:40:11 GMT</pubDate><guid isPermaLink="false">Closed Issue: -CreateEmptyFolders flag condition is not implemented. [7130] 20130516104011A</guid></item><item><title>New Post: timeout </title><link>http://spbulkdocumentimport.codeplex.com/discussions/434534</link><description>&lt;div style="line-height: normal;"&gt;I see the same issue as well, Windows 7 x64 uploading to SP2013 Server - timeout on several files, always at 180 seconds.&lt;br /&gt;
&lt;/div&gt;</description><author>FastFngrz</author><pubDate>Tue, 23 Apr 2013 01:37:33 GMT</pubDate><guid isPermaLink="false">New Post: timeout  20130423013733A</guid></item><item><title>New Comment on "Command-line options"</title><link>http://spbulkdocumentimport.codeplex.com/wikipage?title=Command-line options&amp;ANCHOR#C27009</link><description>The version I downloaded a couple of weeks ago lists this command-line argument&amp;#58;&amp;#10;&amp;#10;-MovedFolder  - If present, all imported files will be moved to the specified folder&amp;#10;&amp;#10;Would you document this argument here as well, please&amp;#63;  I don&amp;#39;t seem to be giving it what it wants, or perhaps it doesn&amp;#39;t really exist in the code itself...&amp;#63;  Thanks&amp;#33;</description><author>GoCart</author><pubDate>Wed, 27 Mar 2013 18:20:58 GMT</pubDate><guid isPermaLink="false">New Comment on "Command-line options" 20130327062058P</guid></item><item><title>Created Issue: How to add metadata to sharepoint site [9956]</title><link>http://spbulkdocumentimport.codeplex.com/workitem/9956</link><description>Hi admin ,,, &lt;br /&gt;I have toke this source code and tested it ,, and every things gone ok ,, but I want to import a metadata for example for a picture to my sharepoint 2010 site , how can I do it &amp;#63;&amp;#63; &lt;br /&gt;&lt;br /&gt;B.R &lt;br /&gt;Wafaa&lt;br /&gt;</description><author>Wafaa</author><pubDate>Wed, 13 Mar 2013 09:23:51 GMT</pubDate><guid isPermaLink="false">Created Issue: How to add metadata to sharepoint site [9956] 20130313092351A</guid></item><item><title>New Post: CreatedBy and ModifiedBy not imported.</title><link>http://spbulkdocumentimport.codeplex.com/discussions/268716</link><description>&lt;div style="line-height: normal;"&gt;Hi Tyler,&lt;br /&gt;
&lt;br /&gt;
Great to hear that you used the tool with success, and thanks for sharing your improvements and thoughts. I am not working on this project anymore, but i'll contact some people with the suggestion to incorporate them in a new release.&lt;br /&gt;
&lt;/div&gt;</description><author>melg</author><pubDate>Thu, 07 Mar 2013 14:51:05 GMT</pubDate><guid isPermaLink="false">New Post: CreatedBy and ModifiedBy not imported. 20130307025105P</guid></item><item><title>New Post: Does it work with SharePoint Online?</title><link>http://spbulkdocumentimport.codeplex.com/discussions/435729</link><description>&lt;div style="line-height: normal;"&gt;I take it this doesn't work with SharePoint Online? Doesn't seem possible to pass login credentials properly.&lt;br /&gt;
&lt;/div&gt;</description><author>finisterre</author><pubDate>Thu, 07 Mar 2013 11:44:37 GMT</pubDate><guid isPermaLink="false">New Post: Does it work with SharePoint Online? 20130307114437A</guid></item><item><title>Commented Issue: Problem with illegal chars and blank [9932]</title><link>http://spbulkdocumentimport.codeplex.com/workitem/9932</link><description>I need to make a massive upload to SP from a shared disk, but uploader skips several files having filename starting with illegal chars followed by space.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;eg&amp;#58; &amp;#34;&amp;#126; A Cover Letter - Charter of Flotel.pdf&amp;#34;&lt;br /&gt;&lt;br /&gt;&amp;#34;ERROR System.Net.WebException&amp;#58; The remote server returned an error&amp;#58; &amp;#40;414&amp;#41; REQUEST URI TOO LONG.&amp;#34;&lt;br /&gt;&lt;br /&gt;Your fantastic tool removes illegal but not the space.&lt;br /&gt;&lt;br /&gt;Tnx&lt;br /&gt;Sergio&lt;br /&gt;Comments: ** Comment from web user: sluppo ** &lt;p&gt;Solved by myself:&lt;/p&gt;&lt;p&gt;In Class FileNameConverter it is sufficient to invert order:&lt;br&gt;first replace illegal characters &lt;br&gt;next trim &amp;quot;.&amp;quot; and &amp;quot; &amp;quot; from filename&lt;/p&gt;&lt;p&gt;bye&lt;br&gt;Sergio&lt;/p&gt;</description><author>sluppo</author><pubDate>Tue, 05 Mar 2013 15:03:18 GMT</pubDate><guid isPermaLink="false">Commented Issue: Problem with illegal chars and blank [9932] 20130305030318P</guid></item><item><title>Created Issue: Problem with illegal chars and blank [9932]</title><link>http://spbulkdocumentimport.codeplex.com/workitem/9932</link><description>I need to make a massive upload to SP from a shared disk, but uploader skips several files having filename starting with illegal chars followed by space.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;eg&amp;#58; &amp;#34;&amp;#126; A Cover Letter - Charter of Flotel.pdf&amp;#34;&lt;br /&gt;&lt;br /&gt;&amp;#34;ERROR System.Net.WebException&amp;#58; The remote server returned an error&amp;#58; &amp;#40;414&amp;#41; REQUEST URI TOO LONG.&amp;#34;&lt;br /&gt;&lt;br /&gt;Your fantastic tool removes illegal but not the space.&lt;br /&gt;&lt;br /&gt;Tnx&lt;br /&gt;Sergio&lt;br /&gt;</description><author>sluppo</author><pubDate>Mon, 04 Mar 2013 16:28:24 GMT</pubDate><guid isPermaLink="false">Created Issue: Problem with illegal chars and blank [9932] 20130304042824P</guid></item><item><title>New Post: timeout </title><link>http://spbulkdocumentimport.codeplex.com/discussions/434534</link><description>&lt;div style="line-height: normal;"&gt;Hello,&lt;br /&gt;
&lt;br /&gt;
if I'm uploading a large file I always get a timeout on 180 seconds.&lt;br /&gt;
Can i increase this timeout.&lt;br /&gt;
I checked it with my Userinterface on my sharepoint account and it works.&lt;br /&gt;
Only with Sharepoint bulk importers i get this failure.&lt;br /&gt;
&lt;br /&gt;
BR&lt;br /&gt;
&lt;/div&gt;</description><author>bigben73</author><pubDate>Tue, 26 Feb 2013 12:47:38 GMT</pubDate><guid isPermaLink="false">New Post: timeout  20130226124738P</guid></item><item><title>New Post: Creation folder error</title><link>http://spbulkdocumentimport.codeplex.com/discussions/432349</link><description>&lt;div style="line-height: normal;"&gt;I made a test renaming the folder _vti_cnf and it works.&lt;br /&gt;
&lt;br /&gt;
_vti_cnf is na invalid expression. or prohibited word?&lt;br /&gt;
&lt;/div&gt;</description><author>gregorywmitt2</author><pubDate>Thu, 07 Feb 2013 19:37:02 GMT</pubDate><guid isPermaLink="false">New Post: Creation folder error 20130207073702P</guid></item><item><title>New Post: CreatedBy and ModifiedBy not imported.</title><link>http://spbulkdocumentimport.codeplex.com/discussions/268716</link><description>&lt;div style="line-height: normal;"&gt;Here I will describe some things I learned in my migration job using this application.  I migrated over 300K files using this tool, so it definitely can hold up and do the job.&lt;br /&gt;
&lt;br /&gt;
One key is to divide and conquer.  My entire migration consisted of about 20 'sub-jobs'.  It is impossible to get through a massive migration in one shot.   You will run into roadblocks.&lt;br /&gt;
&lt;br /&gt;
On very large jobs, it is important that you be able to restart where you left off should the program terminate in the middle of the job.  To do this, I added a 'moveFileAsCompleted(file)' method into the SharePointRepository CreateFile() method right after the 'fileCreated = true' line.  This meant that if my job error'd, I could identify and fix the error and immediatly start back where I left off.  The moveFileAsCompleted simply moved the file that just uploaded into a 'completed' area outside of the path that the orbitone importer was working on.  It looked something like:&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;        private void moveFileAsCompleted(ImportFile file) {
            var newPathFull = file.SourceFile.FullName.Replace(&amp;quot;\\Version&amp;quot;, &amp;quot;\\VersionMoved&amp;quot;);
            var newPath = file.SourceFile.DirectoryName.Replace(&amp;quot;\\Version&amp;quot;, &amp;quot;\\VersionMoved&amp;quot;);
            if (!Directory.Exists(newPath)) {
                Directory.CreateDirectory(newPath);
            }
            System.IO.File.Move(file.OriginalFullName, newPathFull);
            var metaFile = file.SourceFile.FullName + &amp;quot;.meta&amp;quot;;
            if (System.IO.File.Exists(metaFile)) {
                System.IO.File.Move(metaFile, newPathFull + &amp;quot;.meta&amp;quot;);
            }
        }&lt;/code&gt;&lt;/pre&gt;

There is a filesize cap of 200MB by default in the code.  If you need to override this, check out SharePointRepository.CreateValidator().  Here, you can also edit blocked file extensions and other options you may wish to alter.&lt;br /&gt;
&lt;br /&gt;
If you wish to load multiple versions of a file, my approach was to have a filestructure representing each version.  For example, if I had 200 files and 3 of those went all the way up to version 5, I would have a folder structure like so:&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;../Version1/(my base)
../Version2/(my base)
../Version3/(my base)
../Version4/(my base)
../Version5/(my base)
&lt;/code&gt;&lt;/pre&gt;

The Version1 folder would have all 200 of my documents.  The Version2 folder would have any of those 200 which had at least two versions.  The Version5 folder would have only the 3 files which actually had a version 5.  With that folder structure in place, I would run a .bat file which would sequentially call the importer similar to the one below:&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;
...\bin\Debug\OrbitOne.SharePoint.Importer.CommandLine.exe -site:&amp;quot;http://mysite.com/programmgmt&amp;quot;   -documentlibrary:&amp;quot;Program Documents&amp;quot;  -username:xxx  -password:xxx -domain:corp -CreateFolders  -folder:&amp;quot;E:\xml_export\programmgmt\Version1\&amp;quot;
...\bin\Debug\OrbitOne.SharePoint.Importer.CommandLine.exe -site:&amp;quot;http://mysite.com/programmgmt&amp;quot;   -documentlibrary:&amp;quot;Program Documents&amp;quot;  -username:xxx  -password:xxx -domain:corp -CreateFolders  -folder:&amp;quot;E:\xml_export\programmgmt\Version2\&amp;quot;
...\bin\Debug\OrbitOne.SharePoint.Importer.CommandLine.exe -site:&amp;quot;http://mysite.com/programmgmt&amp;quot;   -documentlibrary:&amp;quot;Program Documents&amp;quot;  -username:xxx  -password:xxx -domain:corp -CreateFolders  -folder:&amp;quot;E:\xml_export\programmgmt\Version3\&amp;quot;
...\bin\Debug\OrbitOne.SharePoint.Importer.CommandLine.exe -site:&amp;quot;http://mysite.com/programmgmt&amp;quot;   -documentlibrary:&amp;quot;Program Documents&amp;quot;  -username:xxx  -password:xxx -domain:corp -CreateFolders  -folder:&amp;quot;E:\xml_export\programmgmt\Version4\&amp;quot;
...\bin\Debug\OrbitOne.SharePoint.Importer.CommandLine.exe -site:&amp;quot;http://mysite.com/programmgmt&amp;quot;   -documentlibrary:&amp;quot;Program Documents&amp;quot;  -username:xxx  -password:xxx -domain:corp -CreateFolders  -folder:&amp;quot;E:\xml_export\programmgmt\Version5\&amp;quot;&lt;/code&gt;&lt;/pre&gt;

As long as Version tracking is turned on in your doc library, each version should subsequently upload OK.  I do recall that I had to alter the DocumentLibraryRepository.CreateFile() function to enable the upload over an existing file.  Here is a version of that function which also includes some detailed error handling as well as some retry logic:&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;
void CreateFile(ImportFile importFile, ClientContext context)
        {
            string serverRelativeFileUrl = string.Concat(m_serverRelativeListUrl, importFile.ServerRelativePath);

            using (var stream = importFile.OpenRead())
            {
                if (m_settings.Mode == ImportMode.Execute)
                {
                    log.Info(&amp;quot;In CreateFile: &amp;quot; + ApplicationUrl + serverRelativeFileUrl);
                    int tries = 0;
                    bool successful = false;
                    int limit = 10;
                    while(tries &amp;lt; limit &amp;amp;&amp;amp; !successful) {
                        try {
                            tries++;
                            // added true to overwrite since checks are done earlier anyways.....TS
                            log.Info(&amp;quot;About to call File.SaveBinaryDirect: &amp;quot; + serverRelativeFileUrl);
                            File.SaveBinaryDirect(context, serverRelativeFileUrl, stream, true);
                            successful = true;
                        }
                        catch (Exception ex) {
                            if (ex.Message.ToLower().Contains(&amp;quot;internal server error&amp;quot;)) {
                                log.Info(&amp;quot;Caught retryable File.SaveBinaryDirect exception for: &amp;quot; + serverRelativeFileUrl);
                            } else {
                                throw (ex); // force quit
                            }
                        }
                        if (tries &amp;gt;= limit) {
                            throw new Exception(&amp;quot;Retried &amp;quot; + limit.ToString() + &amp;quot; times and still didnt succeed for: &amp;quot; +
                                          serverRelativeFileUrl);
                        }
                    }

                    log.Info(&amp;quot;Succeeded ( &amp;quot; + tries + &amp;quot; attempt(s) ): &amp;quot; + serverRelativeFileUrl);
                }
            }
        }
&lt;/code&gt;&lt;/pre&gt;

Job validation:  Part of my process was validating that each file was uploaded on SharePoint after the job had completed.  My method to do this was to leverage my custom metadata.  In my metadata, I had a field 'SharenetID' which contained a unique ID for each document.  So, when my job was finished, I created a process which would read all my source files, parse their SharenetIDs into a giant list, and verify each of those IDs was found on a document in SharePoint.  When this was done, I would be given a list of all docs which did not migrate successfully.  I would then handle these on a case by case basis.  Sometimes the problem would expose a bug in my code which I would fix.  Sometime there would be an invalid filetype that failed upload.  Sometime, I would just upload the file via the browser and be done with it.   If the documents you are migrating do not have a unique identifier, you could create a script/app which simply appends an additional metadata value to the object with a unique GUID.  Then, after importing, you will have a means to verify completion on a file-by-file basis.  &lt;br /&gt;
&lt;br /&gt;
The 'workhorse' block of code in my 'verifier' function is below.  This is the code which will connect to a sharepoint library and pulldown all values of a given column (in my code below, it is SharenetID):&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;           //Dictionary&amp;lt;String, String&amp;gt; xmlIds =   .....my externally mapped list of IDs I am checking on SharePoint....

           List&amp;lt;string&amp;gt; spDocs = new List&amp;lt;string&amp;gt;(10000);

            using (var context = CreateContext(pArga)) {
                context.RequestTimeout = 10*60*1000;  // ten minutes
                Web web = context.Web;
                List list = context.Web.Lists.GetByTitle(pArga.SharePointLibrary);
                context.Load(context.Site);
                context.ExecuteQuery();
                context.Load(list);

                CamlQuery cq = new CamlQuery();

                cq.ViewXml =
                    &amp;quot;&amp;lt;View Scope='Recursive'&amp;gt;&amp;lt;ViewFields&amp;gt;&amp;lt;FieldRef Name='SharenetID'/&amp;gt;&amp;lt;/ViewFields&amp;gt;&amp;lt;/View&amp;gt;&amp;quot;;

                ListItemCollection collListItem = list.GetItems(cq);

                context.Load(collListItem);

                context.ExecuteQuery();

                foreach (ListItem oListItem in collListItem) {
                    if (oListItem[&amp;quot;SharenetID&amp;quot;] != null)
                        spDocs.Add(oListItem[&amp;quot;SharenetID&amp;quot;].ToString());
                }


                foreach (var xid in xmlIds.Keys) {
                    if (!spDocs.Contains(xid)) {
                        log(&amp;quot;=========================================&amp;quot;);
                        log(&amp;quot;Didn't find On SP: &amp;quot; + xid);
                        log(xmlIds[xid]);
                        var sizeString = &amp;quot;File not found....&amp;quot;;
                        if (File.Exists(xmlIds[xid])) {
                            sizeString = xmlIds[xid].Length.ToString();
                        }
                        log(sizeString);
                    }
                }

            }&lt;/code&gt;&lt;/pre&gt;

Performance:  Performance was acceptable by default.  I was able to increase perfomance by implementing multi-threading.  I found best performance with around 5-8 threads.  You could also simulate multithreading by running multiple instances of the exporter on different physical folders. &lt;br /&gt;
&lt;br /&gt;
That's all I could think of at the moment.  If there are any questions, please post in here and I will reply the best I can.&lt;br /&gt;
&lt;/div&gt;</description><author>tschacht</author><pubDate>Thu, 07 Feb 2013 18:59:21 GMT</pubDate><guid isPermaLink="false">New Post: CreatedBy and ModifiedBy not imported. 20130207065921P</guid></item><item><title>New Post: CreatedBy and ModifiedBy not imported.</title><link>http://spbulkdocumentimport.codeplex.com/discussions/268716</link><description>&lt;div style="line-height: normal;"&gt;Hi all,&lt;br /&gt;
&lt;br /&gt;
My company restrictions ended up preventing me from uploading me entire modified solution.  However, I have recreated some demonstration classes to explain the bulk of the process I used to implement a AD user import as well as a general metadata import.&lt;br /&gt;
&lt;br /&gt;
To be able to import domain users,  each user must be an active user already on the sharepoint site.  Your customemetadata provider (in the below example, SharenetCustomMetadataProvider), will use an instance of a IUserMapper (in the below example, SharenetUserMapper) to resolve username strings to their SharePoint equivelent user.  The SharenetUserMapper below uses another class provided, CorpDomainUserRepository, to connect to the passed in SharePoint site and get a list of all SharePoint users on that site.  
&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;public class SharenetCustomMetadataProvider : IMetaDataProvider {

        private IUserMapper myUserMapper;

        public SharenetCustomMetadataProvider() {
            myUserMapper = new SharenetUserMapper(SettingsSingleton.GlobalSettings.SiteUrl);
        }

        public User GetAuthor(string filename) {
            var d = GetAllMetaData(filename);
            if (d.ContainsKey(&amp;quot;CreatedBy&amp;quot;))
            {
                if (myUserMapper.Map(d[&amp;quot;CreatedBy&amp;quot;].ToUpperInvariant()) != null) {
                    return myUserMapper.Map(d[&amp;quot;CreatedBy&amp;quot;].ToUpperInvariant());
                }
            }
            return null;
        }

        public User GetEditor(string filename) {
            var d = GetAllMetaData(filename);
            if (d.ContainsKey(&amp;quot;ModifiedBy&amp;quot;)) {
                if (myUserMapper.Map(d[&amp;quot;ModifiedBy&amp;quot;].ToUpperInvariant()) != null) {
                    return myUserMapper.Map(d[&amp;quot;ModifiedBy&amp;quot;].ToUpperInvariant());
                }
            }
            return null;
        }

        private IDictionary&amp;lt;string, string&amp;gt; GetAllMetaData(string filename) {
            var d = ParseMetadata(filename);

            return d;
        }

        public IDictionary&amp;lt;string, string&amp;gt; GetMetaData(string filename) {
            var d = ParseMetadata(filename);
            if (d.ContainsKey(&amp;quot;CreatedBy&amp;quot;)) d.Remove(&amp;quot;CreatedBy&amp;quot;);
            if (d.ContainsKey(&amp;quot;ModifiedBy&amp;quot;)) d.Remove(&amp;quot;ModifiedBy&amp;quot;);
            return d;
        }

        private Dictionary&amp;lt;string, string&amp;gt; ParseMetadata(string diskPath) {

            var dict = new Dictionary&amp;lt;string, string&amp;gt;();
            var metadataFilename = &amp;quot;&amp;quot;;

            if (Directory.Exists(diskPath)) {
                DirectoryInfo di = new DirectoryInfo(diskPath);
                metadataFilename = di.FullName + Path.DirectorySeparatorChar + &amp;quot;folder.meta&amp;quot;;
            } else if (File.Exists(diskPath)) {
                FileInfo fi = new FileInfo(diskPath);
                metadataFilename = fi.FullName + &amp;quot;.meta&amp;quot;;
            }


            if (!String.IsNullOrEmpty(metadataFilename) &amp;amp;&amp;amp; File.Exists(metadataFilename)) {
                var lines = File.ReadAllLines(metadataFilename);
                foreach (string line in lines) {
                    if (line.Contains(&amp;quot;=&amp;quot;)) {
                        dict[line.Substring(0, line.IndexOf('='))] = line.Substring(line.IndexOf('=') + 1);
                    }
                }
            }


            //dict.ToList().ForEach(x =&amp;gt; Console.WriteLine(x.Key + &amp;quot;:&amp;quot; + x.Value));
            return dict;

        }

    }

    public class SharenetUserMapper : IUserMapper
    {
        private string SiteCollectionUrl { get; set; }
        private CorpDomainUserRepository m_repository;
        private IDictionary&amp;lt;string, User&amp;gt; m_mappings;

        public SharenetUserMapper(string siteCollectionUrl) {
            SiteCollectionUrl = siteCollectionUrl;
        }

        public User Map(string username) {

            // lazy init
            if (m_repository == null) {
                m_repository = new CorpDomainUserRepository(SiteCollectionUrl);
                m_mappings = m_repository.GetUsers().ToDictionary(
                    user =&amp;gt; user.Name.ToUpperInvariant(),
                    user =&amp;gt; user
                    );
            }


            if (!m_mappings.ContainsKey(username.ToUpperInvariant())) {
                Console.WriteLine(&amp;quot;can't find user: &amp;quot; + username.ToUpperInvariant());
                return null;
            }
            return m_mappings[username.ToUpperInvariant()];
        }
    }


    public class CorpDomainUserRepository
    {
        private string m_url;

        public CorpDomainUserRepository(string url) {
            m_url = url;
        }

        public IList&amp;lt;User&amp;gt; GetUsers() {
            using (var context = new ClientContext(m_url)) {
                var userList = context.Web.SiteUserInfoList;
                var users = userList.GetItems(new CamlQuery { ViewXml = &amp;quot;&amp;lt;View/&amp;gt;&amp;quot; });
                context.Load(users);
                context.ExecuteQuery();


                foreach (var user in users) {
                    //Console.WriteLine(user[&amp;quot;Name&amp;quot;]);
                }

                var ulist = new List&amp;lt;User&amp;gt;();

                foreach (var user in users) {
                    ulist.Add(
                        new User {
                            Id = Convert.ToInt32(user[&amp;quot;ID&amp;quot;]),
                            Name = user[&amp;quot;Name&amp;quot;].ToString()
                        }

                        );
                }

                return ulist;
                //                return null;

            }
        }
    }
&lt;/code&gt;&lt;/pre&gt;

My particular implementation was to do like danieleg mentioned above:  For each document imported into sharepoint, I had a corresponding metadata file in the same folder.  For example, if I had Spreadsheet.xls, I would have an additional Spreadsheet.xls.metadata file with each line having a key/value pair seperated by an equals sign.  One thing to remember is that you need to set these .metadata files as 'hidden', or the importer will import them into sharepoint as well.  Here are the example contents of one of those files:&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;Description0=Emergency Support for Process
URL=https://sharenet.google.com/Open/389034796
BaseName=Emergency Support for Process
ModifiedBy=addomain\sptadmin
CreatedBy=addomain\johndoe
SharenetID=389034814&lt;/code&gt;&lt;/pre&gt;

In the example above:  URL and SharenetID are custom defined fields on my doc library.  BaseName and Description0 correspond to the filename and description fields.  ModifiedBy and CreatedBy correspond to AD users.  The OrbitOne code tries to automatically map any fieldnames to a corresponding existing field on the sharepoint object.&lt;br /&gt;
&lt;br /&gt;
If you look in the SharenetCustomMetadataProvider, the 'ParseMetadata()' method examines the passed in sharepoint doc file and loads in the corresponding metadata file should it exist.  I also added support for attaching metadata to folders via a 'folder.meta' file that lives inside each folder.&lt;br /&gt;
&lt;br /&gt;
FYI, the code that invokes the metadata file load is inside the FileSystemSource.Load() method.&lt;br /&gt;
&lt;br /&gt;
To directly specify which custom metadata file to use, you can edit the constructor of FileSystemSource().  You can see in there where the FileSystemSource.MetaDataProvider object is being initialized. &lt;br /&gt;
&lt;br /&gt;
If there are any questions, please leave them here.  I will monitor the thread and answer the best I can.&lt;br /&gt;
&lt;/div&gt;</description><author>tschacht</author><pubDate>Thu, 07 Feb 2013 18:08:24 GMT</pubDate><guid isPermaLink="false">New Post: CreatedBy and ModifiedBy not imported. 20130207060824P</guid></item><item><title>New Post: Creation folder error</title><link>http://spbulkdocumentimport.codeplex.com/discussions/432349</link><description>&lt;div style="line-height: normal;"&gt;I have the following error when i execute a bulk import from a file server.&lt;br /&gt;
&lt;br /&gt;
The user who execute bulk import have permission to create folders and upload files in the SharePoint library. This user doesn't have any quota configuration.&lt;br /&gt;
&lt;br /&gt;
What is wrong?&lt;br /&gt;
&lt;br /&gt;
This error is caused by variable overflow or something like this?&lt;br /&gt;
&lt;br /&gt;
PS C:\spImporter&amp;gt; .\OrbitOne.SharePoint.Importer.exe -folder:&amp;quot;d:\teste2&amp;quot; -site:&amp;quot;&lt;a href="http://docs.senacrs.com.br/sites/asti/&amp;quot;
-documentlibrary:&amp;quot;teste&amp;quot;" rel="nofollow"&gt;http://docs.senacrs.com.br/sites/asti/"
-documentlibrary:"teste"&lt;/a&gt; -createfolders&lt;br /&gt;
INFO - Configuring application&lt;br /&gt;
INFO - Initializing Sharepoint Connection&lt;br /&gt;
INFO - Initializing Validation&lt;br /&gt;
INFO - Initializing data source: File system: d:\teste2&lt;br /&gt;
INFO - Number of files: 2&lt;br /&gt;
INFO - Number of folders: 11&lt;br /&gt;
INFO - Number of empty folders: 10&lt;br /&gt;
INFO - Total file size: 0 bytes&lt;br /&gt;
INFO - Start Import&lt;br /&gt;
&lt;br /&gt;
Unhandled Exception: Microsoft.SharePoint.Client.ServerException: Não é possível criar a pasta &amp;quot;sites/asti/teste/Desenvo&lt;br /&gt;
lvimento/Sistemas/ESTUDOS_TECNOLOGIAS E PROJETOS/Projetos/AdmNET/Codificação/Referencias/Site/Administracao/toolbar/_vti&lt;br /&gt;
_cnf&amp;quot;.&lt;br /&gt;
   at Microsoft.SharePoint.Client.ClientRequest.ProcessResponseStream(Stream responseStream)&lt;br /&gt;
   at Microsoft.SharePoint.Client.ClientRequest.ProcessResponse()&lt;br /&gt;
   at Microsoft.SharePoint.Client.ClientRequest.ExecuteQueryToServer(ChunkStringBuilder sb)&lt;br /&gt;
   at Microsoft.SharePoint.Client.ClientRequest.ExecuteQuery()&lt;br /&gt;
   at Microsoft.SharePoint.Client.ClientRuntimeContext.ExecuteQuery()&lt;br /&gt;
   at Microsoft.SharePoint.Client.ClientContext.ExecuteQuery()&lt;br /&gt;
   at OrbitOne.SharePoint.Importer.SharePoint.DocumentLibraryRepository.CreateFolder(ImportFolder folder)&lt;br /&gt;
   at OrbitOne.SharePoint.Importer.SharePoint.DefaultSharePointDestination.ImportContents(ImportFolder folder)&lt;br /&gt;
   at OrbitOne.SharePoint.Importer.SharePoint.DefaultSharePointDestination.ImportContents(ImportFolder folder)&lt;br /&gt;
   at OrbitOne.SharePoint.Importer.SharePoint.DefaultSharePointDestination.ImportContents(ImportFolder folder)&lt;br /&gt;
   at OrbitOne.SharePoint.Importer.SharePoint.DefaultSharePointDestination.ImportContents(ImportFolder folder)&lt;br /&gt;
   at OrbitOne.SharePoint.Importer.SharePoint.DefaultSharePointDestination.ImportContents(ImportFolder folder)&lt;br /&gt;
   at OrbitOne.SharePoint.Importer.SharePoint.DefaultSharePointDestination.ImportContents(ImportFolder folder)&lt;br /&gt;
   at OrbitOne.SharePoint.Importer.SharePoint.DefaultSharePointDestination.ImportContents(ImportFolder folder)&lt;br /&gt;
   at OrbitOne.SharePoint.Importer.SharePoint.DefaultSharePointDestination.ImportContents(ImportFolder folder)&lt;br /&gt;
   at OrbitOne.SharePoint.Importer.SharePoint.DefaultSharePointDestination.ImportContents(ImportFolder folder)&lt;br /&gt;
   at OrbitOne.SharePoint.Importer.SharePoint.DefaultSharePointDestination.ImportContents(ImportFolder folder)&lt;br /&gt;
   at OrbitOne.SharePoint.Importer.SharePoint.DefaultSharePointDestination.ImportContents(ImportFolder folder)&lt;br /&gt;
   at OrbitOne.SharePoint.Importer.SharePoint.DefaultSharePointDestination.ImportContents(ImportFolder folder)&lt;br /&gt;
   at OrbitOne.SharePoint.Importer.SharePoint.DefaultSharePointDestination.Import(ImportItem importItem)&lt;br /&gt;
   at OrbitOne.SharePoint.Importer.DocumentImporter.Execute()&lt;br /&gt;
   at OrbitOne.SharePoint.Importer.CommandLine.Program.Main(String[] args)&lt;br /&gt;
&lt;/div&gt;</description><author>gregorywmitt2</author><pubDate>Thu, 07 Feb 2013 17:28:51 GMT</pubDate><guid isPermaLink="false">New Post: Creation folder error 20130207052851P</guid></item><item><title>New Post: CreatedBy and ModifiedBy not imported.</title><link>http://spbulkdocumentimport.codeplex.com/discussions/268716</link><description>&lt;div style="line-height: normal;"&gt;Hi Tyler can you send me a copy of your solution to handle metadata? Thanks &lt;a href="mailto:dguarneri71@gmail.com
I" rel="nofollow"&gt;dguarneri71@gmail.com
I&lt;/a&gt; have to upload a directory structure with some files and any file has its own metadata.&lt;br /&gt;
I want to put the files and metadata in the same folder by creating a metadata file for each file to be loaded with a custom extension, for example &amp;quot;.metadata&amp;quot;. I use a custom provider. Do you think it possible?&lt;br /&gt;
&lt;/div&gt;</description><author>danieleg</author><pubDate>Thu, 07 Feb 2013 14:28:03 GMT</pubDate><guid isPermaLink="false">New Post: CreatedBy and ModifiedBy not imported. 20130207022803P</guid></item><item><title>New Post: Unsupported  value line argument format.</title><link>http://spbulkdocumentimport.codeplex.com/discussions/413664</link><description>&lt;div style="line-height: normal;"&gt;
&lt;p&gt;HI&lt;/p&gt;
&lt;p&gt;I downloaded the setup and running the application using following command line&lt;/p&gt;
&lt;p&gt;OrbitOne.SharePoint.Importer.exe -folder:&amp;quot;&lt;a href="file://\\10.201.61.55\Share_Ardhendu"&gt;\\201.21.55.15\Share_AK&lt;/a&gt;&amp;quot; site:&lt;a href="http://sp2010vm1:37686/sites/MyRecordCenter/"&gt;http://sp2010vm1:37686/sites/MyRecordCenter/&lt;/a&gt; -documentlibrary:AKTestDocLib&lt;/p&gt;
&lt;p&gt;I am getting following errror, please let me know If I am missing anything. I tested I have the full access of shared folder and as well as on site also.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;
2012-12-21 11:46:05,111 ERROR System.ArgumentException: Unsupported&amp;nbsp; value line argument format.&lt;br&gt;
Parameter name: site:http://sp2010vm1:37686/sites/MyRecordCenter&lt;br&gt;
&amp;nbsp;&amp;nbsp; at OrbitOne.SharePoint.Importer.CommandLineParsing.CommandLineDictionary.AddArgument(String argument)&lt;br&gt;
&amp;nbsp;&amp;nbsp; at OrbitOne.SharePoint.Importer.CommandLineParsing.CommandLineDictionary.FromArguments(IEnumerable`1 arguments, Char keyCharacter, Char valueCharacter)&lt;br&gt;
&amp;nbsp;&amp;nbsp; at OrbitOne.SharePoint.Importer.CommandLineParsing.CommandLineParser.ParseArguments(Object valueToPopulate, IEnumerable`1 args, Char keyCharacter, Char valueCharacter)&lt;br&gt;
&amp;nbsp;&amp;nbsp; at OrbitOne.SharePoint.Importer.CommandLine.Program.GetSettings(IEnumerable`1 args)&lt;br&gt;
2012-12-21 11:46:05,131 ERROR documentlibrary is required&lt;br&gt;
2012-12-21 11:46:05,131 ERROR site url is required&lt;br&gt;
2012-12-21 11:46:05,132 ERROR folder is required&lt;br&gt;
2012-12-21 11:46:05,142 ERROR Settings are not valid, Import aborted.&lt;/p&gt;
&lt;/div&gt;</description><author>avi081265</author><pubDate>Fri, 21 Dec 2012 06:23:33 GMT</pubDate><guid isPermaLink="false">New Post: Unsupported  value line argument format. 20121221062333A</guid></item><item><title>New Post: does it work for sharepoint 2007?</title><link>http://spbulkdocumentimport.codeplex.com/discussions/400493</link><description>&lt;div style="line-height: normal;"&gt;&lt;p&gt;No, SharePoint 2010 only. It uses the client object Model which was introduced with SharePoint 2010&lt;/p&gt;&lt;/div&gt;</description><author>melg</author><pubDate>Wed, 24 Oct 2012 09:01:34 GMT</pubDate><guid isPermaLink="false">New Post: does it work for sharepoint 2007? 20121024090134A</guid></item><item><title>New Post: does it work for sharepoint 2007?</title><link>http://spbulkdocumentimport.codeplex.com/discussions/400493</link><description>&lt;div style="line-height: normal;"&gt;
&lt;p&gt;does it work for sharepoint 2007?&lt;/p&gt;
&lt;/div&gt;</description><author>tinkoo99</author><pubDate>Tue, 23 Oct 2012 17:33:48 GMT</pubDate><guid isPermaLink="false">New Post: does it work for sharepoint 2007? 20121023053348P</guid></item></channel></rss>