.NET assembly: one user gets "cannot open file \\.nul\" every time
Hi there, I have a C# program that logs into a remote SFTP site and synchronizes directories using the .NET assembly 5.19.5
I've tested it with 10 people, and 9 of them had no issues. the tenth gets the error message "cannot open file \\.nul\". I have verified that he can do a synchronize just using winscp.exe himself, so I am hoping that I can fix this.
The code around where the problem seems to start is pretty simple:
In the process of debugging this, I configured the executable to generate a
I can provide a debug log of it working fine if that is helpful. I am attaching the problem debuglog.
I've tested it with 10 people, and 9 of them had no issues. the tenth gets the error message "cannot open file \\.nul\". I have verified that he can do a synchronize just using winscp.exe himself, so I am hoping that I can fix this.
The code around where the problem seems to start is pretty simple:
string sFileMask = "*|AlfheimLauncher.exe; WinSCP.exe; WinSCPnet.dll; AlfheimLauncher.pdb; config/; Optional Mods/; cache/; LogOutput.log; patchlogs/;"; // white listed files we ignore using (Session session = new Session()) { session.DebugLogPath = "patchlogs\\patchdebug.txt"; session.XmlLogPath = "patchlogs\\xmllog.xml";//System.AppDomain.CurrentDomain.BaseDirectory; session.SessionLogPath = "patchlogs\\patchlog.txt"; SessionOptions sessionOptions = GetSCPSessionOptions(); // Will continuously report progress of synchronization session.FileTransferred += FileTransferred; session.OutputDataReceived += OutputDataReceived; // Connect session.Open(sessionOptions); // get a count of files to possibly be patched TransferOptions tOptions = new TransferOptions(); // White List tOptions.FileMask = sFileMask; ComparisonDifferenceCollection diffs = session.CompareDirectories(SynchronizationMode.Local, System.AppDomain.CurrentDomain.BaseDirectory, remotePath, true, false, SynchronizationCriteria.Size, tOptions); NumberTotalFiles = diffs.Count; // Synchronize files if (NumberTotalFiles > 0) { AnnounceProgress(0, NumberTotalFiles, "Updating Files..."); foreach(ComparisonDifference diff in diffs) { diff.Resolve(session, tOptions); } }
sessionOptions
are broken out into their own function, which I will include here just so you have the complete context:
// we keep our credentials in their own function for ease of maintenance protected SessionOptions GetSCPSessionOptions() { SessionOptions sessionOptions = new SessionOptions { //This account has read-only access to the latest game files, and no permissions beyond that Protocol = Protocol.Sftp, HostName = ConfigurationManager.AppSettings.Get("HostName"), UserName = ConfigurationManager.AppSettings.Get("UserName"), Password = ConfigurationManager.AppSettings.Get("PassWord"), SshHostKeyFingerprint = ConfigurationManager.AppSettings.Get("SshHostKeyFingerprint"), }; return sessionOptions; }
DebugLogPath
and a SessionLogPath
. Interestingly, the executable only generated the DebugLogPath
file for the troubled user (it generated both with me just fine). You can also see that I set the XmlLogPath
to a directory that my application created, just to ensure that this wasn't a permissions issue.
I can provide a debug log of it working fine if that is helpful. I am attaching the problem debuglog.