public void OpenStorage(bool initOrOpen)
        {
            AssertNotDisposed();

            if (!File.Exists(_tagFile))
            {
                if (!initOrOpen)
                {
                    throw new Exception("Vault root path does not contain vault data");
                }

                InitStorage(false);
            }

            var tagVers = File.ReadAllText(_tagFile);

            if (TAG_VERS != tagVers)
            {
                throw new Exception("Vault version mismatch");
            }

            if (File.Exists(_vaultFile))
            {
                using (var s = new FileStream(_vaultFile, FileMode.Open))
                {
                    _vaultMeta = JsonHelper.Load <EntityMeta <VaultInfo> >(s);
                }
            }

            IsStorageOpen = true;
        }
        public void SaveVault(VaultInfo vault)
        {
            AssertOpen();

            var now = DateTime.Now;
            var who = $"{Environment.UserDomainName}\\{Environment.UserName}";

            if (_vaultMeta == null)
            {
                _vaultMeta = new EntityMeta <VaultInfo>
                {
                    CreateDate = now,
                    CreateUser = who,
                    CreateHost = Environment.MachineName,
                }
            }
            ;

            _vaultMeta.UpdateDate = now;
            _vaultMeta.UpdateUser = who;
            _vaultMeta.Entity     = vault;

            // Create a backup just in case there's any fault
            if (File.Exists(_vaultFile))
            {
                File.Copy(_vaultFile, $"{_vaultFile}.bak", true);
            }
            // Sort of a 2-phase commit
            var tmp = $"{_vaultFile}.tmp{DateTime.Now.ToFileTime()}";

            using (var s = new FileStream(tmp, FileMode.Create))
            {
                JsonHelper.Save(s, _vaultMeta, false);
            }
            // Now commit the changes
            File.Copy(tmp, _vaultFile, true);
            File.Delete(tmp);
        }