【问题标题】:How do I generate random file names (Cocoa/Objective-C)如何生成随机文件名(Cocoa/Objective-C)
【发布时间】:2014-11-09 12:20:48
【问题描述】:

我希望能够使用我的 FTP 代码上传文件,然后能够使用随机生成的名称上传文件(最好是 7 个字符长,只有大小写字母)

这是我的ftp方法:

ftpManager = [[FTPManager alloc] init];
success = NO;
NSArray* serverData = nil;
FMServer* srv = [FMServer serverWithDestination:[@"IP" stringByAppendingPathComponent:@"/"] username:@"username" password:@"password"];
srv.port = self.portField.intValue;
switch (action) {
    case upload:
        success = [ftpManager uploadFile:fileURL toServer:srv];
        break;
    default;
        break;

如何编辑上传到 ftp 服务器的文件名?

编辑:添加了“fileURL”的位置 代码:

fileURL = [NSURL URLWithString:@"/tmp/tmpscr.png"];
    action = upload;
    [self runAction];

【问题讨论】:

  • 为什么是preferable 7 characters long with just upper and lower case letters?为什么不是 GUID 或时间戳?
  • 匹配当前格式,因为它用于将图像保存在目录中。所以文件名如“DYGdsUs.png”
  • “标准”方法是使用时间戳。例如,以毫秒为单位的 UNIX“纪元”时间。
  • @HotLicks,如果来自不同设备的名称可能发生冲突,这可能会很危险。 (虽然我不确定从 62 个符号中选择 7 个字母是否足够安全)
  • @vikingosegundo - OP 根本没有描述问题的参数,所以我们真的不知道需要防止什么样的碰撞(如果有的话)。

标签: objective-c cocoa random filenames


【解决方案1】:

我在 NSArray 上给我们一个类别来随机播放

@interface NSArray (RandomUtils)
-(NSArray *)arrayShuffled
@end


@implementation NSArray (RandomUtils)


-(NSArray *)arrayShuffled
{
    NSUInteger count = [self count];
    NSMutableArray *newArray = [NSMutableArray arrayWithArray:self];
    [self enumerateObjectsUsingBlock:^(id obj, NSUInteger index, BOOL *stop) {
        NSUInteger nElements = count - index;
        NSUInteger n = (arc4random_uniform((u_int32_t)nElements)) + index;
        [newArray exchangeObjectAtIndex:index withObjectAtIndex:n];
    }];
    return newArray;
}
@end

并创建可怕的名称,例如:

NSMutableArray *array = [@[] mutableCopy];

for (char i ='a'; i <='z'; ++i) {
    [array addObject:[NSString stringWithFormat:@"%c", i]];
}

for (char i ='A'; i <='Z'; ++i) {
    [array addObject:[NSString stringWithFormat:@"%c", i]];
}

for (int i = 0; i < 10; ++i) {
    [array addObject:[NSString stringWithFormat:@"%i", i]];
}


NSArray *shuffeldArray = [array arrayShuffled];

NSString* name = [[shuffeldArray subarrayWithRange:NSMakeRange(0, 7)] componentsJoinedByString:@""];

【讨论】:

    【解决方案2】:

    这是我通常使用的:

    + (NSURL*)randomFileURLInDocumentsFolder:(NSString*)folderName pathExtension:(NSString*)extension;{
    NSString* folderPath =[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:folderName];
    // check if folder exists, else create
    if (folderName && ![[NSFileManager defaultManager] fileExistsAtPath:folderPath]) {
        [[NSFileManager defaultManager] createDirectoryAtPath:folderPath withIntermediateDirectories:YES attributes:nil error:nil];
    }
    NSURL* tmp = [NSURL fileURLWithPath:[folderPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%f%d.%@", [[NSDate date] timeIntervalSinceReferenceDate],arc4random()%1000, extension]]];
    int count = 0;
    while ([[NSFileManager defaultManager] fileExistsAtPath:[tmp path]]) {
        tmp = [NSURL fileURLWithPath:[folderPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%f%d.%@", [[NSDate date] timeIntervalSinceReferenceDate],arc4random()%1000, extension]]];
        count++;
    }
    
    return tmp;
    

    }

    【讨论】:

      【解决方案3】:

      我有类似的要求,并在NSString 上给自己写了一个类类别,它返回一个给定长度的随机字符串:

      编辑

      按照@NoahWitherspoon 的建议更新为使用arc4random_uniform

      + (NSString *)randomStringOfLength:(NSInteger)length {
      
          char str[length+1];
      
          for (int i=0; i<length; i++){
      
              char rand = randomChar();
      
              str[i]=rand;
          }
      
          str[length]='\0';
      
          return [NSString stringWithCString:str encoding:NSUTF8StringEncoding];
      }
      
      char randomChar(){
      
          char randomLower = 'a' + arc4random_uniform(26);
          char randomUpper = 'A' + arc4random_uniform(6);
          char randomNumber = '0' + arc4random_uniform(9);
      
          int randomVal = arc4random_uniform(100);
      
          char randomAlpha = (randomVal % 2 == 0) ? randomLower : randomUpper;
      
          //If you don't want a numeric as part of the string, just
          //return randomAlpha
      
          return (randomVal % 3 == 0) ? randomNumber : randomAlpha;
      }
      

      【讨论】:

      • 我正在使用 NSLog(@"%c", randomChar());打印到日志,但你可以修改代码,使它只返回一个只有大写和小写字母的 7 长名称? @ChrisH
      • arc4random() % x 不会给你一个均匀分布的值——你应该在这里使用arc4random_uniform(x)
      • @CloudSync 查看我的更新答案。如果您不想要随机字符串中的 alpha 值,只需在 randomChar() 函数中返回 randomAlpha。如果您想要一串 7 个字母,请致电 [NSString randomStringOfLength:7]
      【解决方案4】:

      我用非常简单的方法解决了,我给大家展示一下以供参考:

      NSString *letters = @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
      
      -(NSString *) randomStringWithLength: (int) len {
      
      NSMutableString *randomString = [NSMutableString stringWithCapacity: len];
      
      for (int i=0; i<len; i++) {
          [randomString appendFormat: @"%C", [letters characterAtIndex: arc4random_uniform([letters length]) % [letters length]]];     }
      
      return randomString;
      }
      

      然后我使用这种方法生成长度为 len 的随机混合

      NSString* myString = [self randomStringWithLength:7];
      

      希望对大家有帮助!!!

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多