2013-08-29 2 views
-1

내 프로그램에 문제가 있습니다. C#으로 이미지를 저장하려고합니다. 컴퓨터에서 새 사진을 찍을 때 저장하지만 덮어 쓰게됩니다. 자동으로 숫자와 같이 이름이 다르게 지정됩니까?숫자 시스템 폴더에 이미지 저장 C#

  • 에서는 image1.jpg
  • 에서는 image2.jpg 나는 C#에서 비주얼 스튜디오 2012 코딩을 사용하고

  • Image3.jpg 예를 들면 다음과 같습니다.

    private void button3_Click(object sender, EventArgs e) 
        { 
    
    
         Rectangle form = this.Bounds; 
         using (Bitmap bitmap = new Bitmap(form.Width, form.Height)) 
         { 
          using (Graphics graphic = 
           Graphics.FromImage(bitmap)) 
          { 
           graphic.CopyFromScreen(form.Location, 
            Point.Empty, form.Size); 
          } 
    
    
           bitmap.Save("C:/Users/G73/Desktop/My OVMK Photos//OpenVMK.jpg", ImageFormat.Jpeg); 
    
    
         } 
        } 
    
  • +2

    나는 비주얼 베이직 2012 C#에서 코딩 *을 사용하고 있습니다 *. 우와 야, 정신 f * ck. – CodingIntrigue

    +2

    가독성이 사용 설명서와 상관없는 경우 : http://stackoverflow.com/questions/4657974/how-to-generate-unique-file-names-in-c-sharp – derape

    답변

    3

    당신은 타임 스탬프 같은 것을 추가 할 수 있습니다 :

    bitmap.Save("C:/Users/G73/Desktop/My OVMK Photos//OpenVMK" + DateTime.Now.ToString(yyyyMMddHHmmss) + ".jpg", ImageFormat.Jpeg); 
    
    +0

    이해가 안됩니다. 이것은 답으로 표시되어 있지만 질문의 요구 사항을 해결하지는 못합니다. 엔지니어링 경고가 잘못되었습니다. #redflag 메타에가는 길에 있습니다. 이것은 OP 선택 답변 외에도 커뮤니티 검토 응답을위한 훌륭한 사례입니다. 위의 요구 사항에 의해 해결되는이 솔루션을 깨뜨리는 경우와 정답은 다음과 같습니다. 같은 두 번째 _에서 두 개의 파일을 저장하면 어떻게됩니까? – Gusdor

    +0

    @Gusdor 이것이 문제가된다면 HHmmssffff를 형식으로 사용하십시오. 당신이 1 초에 똑같은 천분의 일에 그것을 저장하면 그 다음에 괜찮습니다. 내 솔루션은이를 수행하는 방법을 제공했지만 사용자의 필요에 맞게 수정할 수 있습니다. 사용자 별 폴더에 저장하고 있기 때문에 인간의 개입을 의미하는 버튼 이벤트를 사용하고 있으며 한 번에 하나의 이미지를 저장한다는 사실을 알기 때문에 초보다 빨리 수행하는 것과는 크게 다릅니다. –

    +0

    내 문제는 그것이 대답으로 표시되어 있지만 그것은 '두 번째'오류가 발생하기 전에 명백히 틀린 것입니다. 유지 관리 시나리오를 고려하십시오. 코드를 변경하면 눈에 보이지 않는 문제가 발생할 수 있습니다. 나는 당신이 문자열 형식으로 지정된 가장 낮은 증분을 Thread.Sleep 수 있지만 그 문자열 형식이 변경되면 (형식 및 수면) 변경할 수있는 2 가지가 없다고 가정합니다. 증분 또는 비자 구절로 형식을 만드는 것은 원래 예제 형식을 사용하는 솔루션보다 더 많은 코드입니다. – Gusdor

    1

    은 아주 간단한 구현 될 수있다 :

    • 는 같은 이름의 파일 백작이 코드 메신저의 일부 사용하고 폴더에
    • 저장하려고하는 파일의 이름에 +1을 더하십시오.

    뭔가 같은 :

    var files = Directory.GetFiles(@"C:/Users/G73/Desktop/My OVMK Photos", "OpenVMK*"); 
    ... 
    var newFileName = string.Format(@"C:/Users/G73/Desktop/My OVMK Photos/OpenVMK{0}.jpg", files.Length+1); 
    bitmap.Save(newFileName, ImageFormat.Jpeg); 
    
    +0

    "OpenVMKsomethingelse.jpg"라고하는 파일은 계산에 포함되지 않습니다. –

    0

    이 같은 시도 : 경우

    string filename = "file"; 
    string extension = "txt"; 
    string path = System.IO.Path.Combine(filename, extension); //desired path 
    
    int i = 1; 
    
    while(System.IO.File.Exists(path)); 
    { 
        //assemble fallback path 
        path = System.IO.Path.Combine(string.Format("{0} ({1})", filename, i++), extension); 
    
        if(int == Int32.MaxValue && System.IO.File.Exists(path)) 
         throw new InvalidOperationException("Too many files and commenters are pedants"); 
    } 
    
    //save your file 
    
    +0

    이것은 점점 증가하는 루프로 이어질 것입니다 .... –

    +0

    같은 패턴으로 같은 이름을 가진 int.MaxValue 파일을 가지고 있다면 아들이 더 큰 문제가 있습니다. 루프를 끝내고 편집했는데 관계없이 여전히 예외가됩니다. – Gusdor

    0
    private void button3_Click(object sender, EventArgs e) 
    { 
    
        Rectangle form = this.Bounds; 
        using (Bitmap bitmap = new Bitmap(form.Width, form.Height)) 
        { 
         using (Graphics graphic = 
          Graphics.FromImage(bitmap)) 
         { 
          graphic.CopyFromScreen(form.Location, 
           Point.Empty, form.Size); 
         } 
    
         int count = 1; 
    
         string baseFileName = "OpenVMK"; 
         string ext = ".jpg"; 
         string pathToFile = "C:/Users/G73/Desktop/My OVMK Photos";    
         while(System.IO.File.Exists(System.IO.Path.Combine(pathToFile, string.Format("{0}{1}{2}", baseFileName, i++, ext))) {}; 
    
         bitmap.Save(System.IO.Path.Combine(pathToFile, string.Format("{0}{1}{2}", baseFileName, i++, ext)), ImageFormat.Jpeg); 
    
    
        } 
    } 
    
    0

    을 파일 이름 항상 항상 추적의 재잘

    같은

    "이미지"+ 숫자 + .jpg

    는 당신은 그러나 증가 된

    string file1 = "image1.jpg"; 
    string file2 = "image13.jpg"; 
    string number = file1.Substring(5, file1.IndexOf(".") - 5); 
    number = file2.Substring(5, file2.IndexOf(".") - 5); 
    

    최대의 번호를 누른 다음 파일 이름을 만들 코딩 할 수

    은, 당신이 얼마나 많은 파일에 따라 달라집니다. 이는 성능에 영향을 줄 수 있습니다. 다른 옵션이 될 수 :

    만 수 (최대 수) 새 이미지 파일을 기록 할 때마다 가 포함 된 파일을 작성,

    • 해당 번호를 읽을
    • 증가 그것은,
    • 이미지 파일을 증가 된 숫자
    • 으로 저장하고 증가 된 번호로 파일을 다시 작성하십시오.
    0

    할 수 있습니다 단지 체크 기존 파일 및 추가 1, 2, 제안 된 파일 이름 3 등 :

    private static int GetNextFileNumber(String fileFullName) { 
         int result = -1; 
    
         String fileName = Path.GetFileNameWithoutExtension(fileFullName); 
         String ext = Path.GetExtension(fileFullName); 
    
         foreach (String file in Directory.GetFiles(Path.GetDirectoryName(fileFullName))) { 
         if (!String.Equals(ext, Path.GetExtension(file), StringComparison.OrdinalIgnoreCase)) 
          continue; 
    
         String name = Path.GetFileNameWithoutExtension(file); 
    
         if (!name.StartsWith(fileName, StringComparison.OrdinalIgnoreCase)) 
          continue; 
    
         if (result < 0) 
          if (name.Equals(fileName, StringComparison.OrdinalIgnoreCase)) 
          result = 1; 
    
         int num = 0; 
    
         if (int.TryParse(name.Substring(fileName.Length), out num)) 
          if (num > result) 
          result = num + 1; 
         } 
    
         return result; 
        } 
    
        private static String GetNextFileName(String fileFullName) { 
         int number = GetNextFileNumber(fileFullName); 
    
         if (number <= 0) 
         return fileFullName; 
    
         return Path.Combine(Path.GetDirectoryName(fileFullName), 
              Path.GetFileNameWithoutExtension(fileFullName) + (number).ToString() + Path.GetExtension(fileFullName)); 
        } 
    
    
        .... 
    
        private void button3_Click(object sender, EventArgs e) 
        { 
         .... 
         // bitmap.Save("C:/Users/G73/Desktop/My OVMK Photos/OpenVMK.jpg", ImageFormat.Jpeg); 
    
         // Instead of file_name use GetNextFileName(file_name): 
         bitmap.Save(GetNextFileName("C:/Users/G73/Desktop/My OVMK Photos/OpenVMK.jpg"), ImageFormat.Jpeg); 
         .... 
        } 
    
    관련 문제