首先,这些是我的意图:
点1-3完美地工作.当我尝试移动数据库时,问题就开始了.我得到一个错误说明:
'The process cannot access the file because it is being used by another process.'
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
首先,我创建一个上下文.我必须在几种方法中使用它,我不想在每次需要时创建它.所以我将它存储为成员.
_sqliteContext = new SqlLiteContext(sqliteContextName);
Run Code Online (Sandbox Code Playgroud)
然后我想访问一个名为的表sync并获取其最新条目.
var sync = _sqliteContext.Syncs.OrderByDescending(s => s.Date);
_lastSync = sync.Any() ? sync.First().Date : new DateTime(0);
Run Code Online (Sandbox Code Playgroud)
而已.然后我关闭上下文.
_sqliteContext.Dispose();
Run Code Online (Sandbox Code Playgroud)
并尝试移动文件.
File.Move(sqliteUploadLocation, sqliteDownloadLocation);
Run Code Online (Sandbox Code Playgroud)
这是我得到例外的地方.
当我用插入替换选择时,如下所示:
var sync = new Sync { Id = Guid.NewGuid().ToString(), Date = DateTime.Now };
_sqliteContext.Syncs.Add(sync);
_sqliteContext.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
这有效,我可以移动数据库.任何想法为什么我的选择不释放锁定?
更新
// Start synchronisation.
new SyncManager(mssqlString, sqliteUploadLocation).Start();
// Move file from upload to download …Run Code Online (Sandbox Code Playgroud) 我试图将一个非常小的文件复制并粘贴到一个由监视服务观察的文件夹中.第一次工作很好,但在所有后续复制和粘贴操作,我得到一个异常,另一个进程已经处理该文件.通过实验,我发现在Windows创建文件时通知我的服务,而不是在复制内容时通知我的服务.如果我锁定文件,Windows无法复制任何数据,文件为空.另一方面,如果我将文件移动到目录中,一切正常.
这是Windows的错误吗?我无法在mac或Linux工作站上测试它.或者也许只是我无能为力.任何帮助表示赞赏.
我的代码如下所示:
try (WatchService watchService = importPath.getFileSystem().newWatchService()) {
importPath.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);
handleExistingFiles();
try {
do {
WatchKey watchKey = watchService.take();
if (!watchKey.isValid()) {
continue;
}
boolean hasCreationEvents = false;
for (WatchEvent<?> event : watchKey.pollEvents()) {
hasCreationEvents |= event.kind().equals(StandardWatchEventKinds.ENTRY_CREATE);
}
watchKey.reset();
if (hasCreationEvents) {
handleNewFiles();
}
}
while (!Thread.currentThread().isInterrupted());
}
catch (InterruptedException ignoredEx) {
Thread.currentThread().interrupt();
}
}
Run Code Online (Sandbox Code Playgroud)