Я работаю над c # .Net 4.5
Мне нужно загрузить некоторые файлы на MongoDB
, а в другом модуле я должен вернуть их обратно на основе метаданных.
для этого я делаю, как показано ниже,
static void uploadFileToMongoDB(GridFSBucket gridFsBucket)
{
if (Directory.Exists(_sourceFilePath))
{
if (!Directory.Exists(_uploadedFilePath))
Directory.CreateDirectory(_uploadedFilePath);
FileInfo[] sourceFileInfo = new DirectoryInfo(_sourceFilePath).GetFiles();
foreach (FileInfo fileInfo in sourceFileInfo)
{
string filePath = fileInfo.FullName;
string remoteFileName = fileInfo.Name;
string extension = Path.GetExtension(filePath);
double fileCreationDate = fileInfo.CreationTime.ToOADate();
GridFSUploadOptions gridUploadOption = new GridFSUploadOptions
{
Metadata = new BsonDocument
{{ "creationDate", fileCreationDate },
{ "extension", extension }}
};
using (Stream fileStream = File.OpenRead(filePath))
gridFsBucket.UploadFromStream(remoteFileName, fileStream, gridUploadOption);
}
}
}
и скачивание,
static void getFileInfoFromMongoDB(GridFSBucket bucket, DateTime startDate, DateTime endDate)
{
double startDateDoube = startDate.ToOADate();
double endDateDouble = endDate.ToOADate();
var filter = Builders<GridFSFileInfo>.Filter.And(
Builders<GridFSFileInfo>.Filter.Gt(x => x.Metadata["creationDate"], startDateDoube),
Builders<GridFSFileInfo>.Filter.Lt(x => x.Metadata["creationDate"], endDateDouble));
IAsyncCursor<GridFSFileInfo> fileInfoList = bucket.Find(filter); //****
if (!Directory.Exists(_destFilePath))
Directory.CreateDirectory(_destFilePath);
foreach (GridFSFileInfo fileInfo in fileInfoList.ToList())
{
string destFile = _destFilePath + "\\" + fileInfo.Filename;
var fileContent = bucket.DownloadAsBytes(fileInfo.Id); //****
File.WriteAllBytes(destFile, fileContent);
}
}
в этом коде (работает, но) у меня есть две проблемы, которые я не уверен, как исправить.
- Если я загрузил файл и загружаю его снова, он действительно получает
загружено. Как это предотвратить?
Конечно, оба загруженных файла имеют разные ObjectId
, но при загрузке файла я не буду знать, какие файлы уже загружены. Поэтому я хочу механизм, который выдает исключение, если я загружаю уже загруженный файл. Является ли это возможным? (Я могу использовать комбинацию имени файла, даты создания и т. Д.)
- Если вы заметили в коде, на самом деле я дважды обращаюсь к серверу баз данных, чтобы получить один файл, записанный на диск, как это сделать одним выстрелом?
Обратите внимание на строки кода, которые я пометил комментарием "// ****". Сначала я запрашиваю базу данных, чтобы получить fileInfo (GridFSFileInfo
). Я ожидал, что смогу получить фактическое содержимое файла только из этих объектов. Но я не нашел никакого связанного свойства или метода в этом объекте. поэтому я должен был сделать var fileContent = bucket.DownloadAsBytes(fileInfo.Id);
, чтобы получить контент. М я здесь что-то упустил?