AWS S3中的物理文件访问

时间:2015-12-23 08:15:28

标签: c# file amazon-web-services amazon-s3

我想将一些本地应用程序移动到亚马逊云中,该云在内部适用于FileInfo以处理某些文件。

我知道存储桶概念以及使用S3FileInfo的文件自适应,它指向存储桶中存储的文件。

但是由于应用程序正在使用FileInfo,我想知道是否有可能以某种方式创建指向存储桶中文件的FileInfo实例?

1 个答案:

答案 0 :(得分:2)

FileInfo类不能直接用于S3对象。你可以做几件事:

  1. 将S3文件夹映射到计算机上的驱动器
  2. 您可以使用TntDrive之类的工具。然后,您可以访问您通常会执行的文件,例如:

    FileInfo file = new FileInfo(@"Z:\Path\myfile.doc");
    
    1. 您可以在访问文件时创建抽象层。我最近在一个项目中做过类似的事情。我所做的是通过通用接口访问对象。您可以查看下面的代码段。
    2. 这样,文件系统依赖性仅封装在TextFilePersistanceProvider类中,其余应用程序可以与任何源一起使用。

      public interface IGamePersistanceProvider
      {
          void Save(Game game);
      }
      
      public class TextFilePersistanceProvider : IGamePersistanceProvider
      {
          private IConfigurationProvider _configurationProvider;
          public TextFilePersistanceProvider(IConfigurationProvider configurationProvider)
          {
              _configurationProvider = configurationProvider;
          }
      
          public void Save(Game game)
          {
              if (game == null) { throw new ArgumentException("Unexpected parameter"); }
      
              var filePath = _configurationProvider.GetValue<string>("LatestGamePath");
      
              var gameAsJson = JsonConvert.SerializeObject(game, Formatting.None, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto });
      
              File.WriteAllText(filePath, gameAsJson);
          }
      }
      
      public class S3PersistanceProvider : IGamePersistanceProvider
      {
          private IConfigurationProvider _configurationProvider;
          public S3PersistanceProvider(IConfigurationProvider configurationProvider)
          {
              _configurationProvider = configurationProvider;
          }
      
          public void Save(Game game)
          {
              if (game == null) { throw new ArgumentException("Unexpected parameter"); }
      
              var gameAsJson = JsonConvert.SerializeObject(game, Formatting.None, new JsonSerializerSettings
              {
                  TypeNameHandling = TypeNameHandling.Auto,
              });
      
              string accessKey = _configurationProvider.GetValue<dynamic>("S3Credentials").AccessKey.ToString();
              string secretKey = _configurationProvider.GetValue<dynamic>("S3Credentials").SecretKey.ToString();
              string bucketName = _configurationProvider.GetValue<dynamic>("S3Credentials").BucketName.ToString();
              string key = game.Name;
      
              using (var s3Client = new AmazonS3Client(new BasicAWSCredentials(accessKey, secretKey), RegionEndpoint.EUWest1))
              {
                  var transferUtil = new TransferUtility(s3Client);
                  var memStream = new MemoryStream(Encoding.UTF8.GetBytes(gameAsJson));
                  transferUtil.Upload(memStream, bucketName, key);
              }
          }
      }
      

      我希望这有点帮助。