압축을 풀거나 파일 복사/붙여넣기를 하다보면 파일명이 255자를 넘어서 오류를 일으키는 경우가 종종 있습니다.
파일명 긴 놈들을 찾아서 좀 줄여줄 필요가 있는데...
자료가 많이 축적되다보면 일일이 찾아보기가 상당히 까다롭습니다.
(가끔 전혀 예상 못한 경로상에 특정 파일이 글자수가 초과되는 등)
그래서 이참에 퇴근하고 간단하게 프로그램을 만들봤는데 이를 공유해봅니다.
원래는 모든 파일들의 경로와 글자수를 예쁘게 정렬해서 보여주게끔 코드를 짜려고 했는데
파일이 1000개가 넘어가면 ui가 뻗어버려서 -_-;
이러쿵저러쿵 하다가 그냥 제일 긴놈 하나만 찾는 프로그램으로 다운그레이드했네요.
처음부터 이정도로만 짜려고 했으면 한시간도 안 걸렸을텐데 아까운 내 시간... ㅠㅠ
혹시 악성코드가 심겨져있을까봐 걱정하는분들을 위해 소스코드도 보여드립니다.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Threading;
namespace FileNameLengthViewer
{
public partial class FilePathLengthViewer : Form
{
public static string TargetFolder = "";
public static int MaximumLength = 0;
public static string MaximumLengthFilePath = "";
public FilePathLengthViewer()
{
InitializeComponent();
}
private void GetTarget_Click(object sender, EventArgs e)
{
TargetFolder = "";
MaximumLength = 0;
MaximumLengthFilePath = "";
FolderBrowserDialog diag = new FolderBrowserDialog();
if (diag.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
TargetFolder = diag.SelectedPath; //selected folder path
}
if (TargetFolder != "")
{
BtnResearch.Enabled = true;
BtnGoToResultFolder.Enabled = true;
CheckPathLength(TargetFolder);
ShowResult();
}
}
private void BtnResearch_Click(object sender, EventArgs e)
{
MaximumLength = 0;
MaximumLengthFilePath = "";
CheckPathLength(TargetFolder);
ShowResult();
}
private void CheckPathLength(string InputFolder)
{
DirectoryInfo TargDirectory = new DirectoryInfo(InputFolder);//Assuming Test is your Folder
FileInfo[] Files = TargDirectory.GetFiles(); //Getting Text files
foreach (FileInfo file in Files)
{
string FilePath = file.Directory.FullName.ToString();
string FullName = Path.Combine(FilePath, file.ToString());
int FileNameLength = Encoding.Default.GetByteCount(FullName);
if (FileNameLength > MaximumLength)
{
MaximumLength = FileNameLength;
MaximumLengthFilePath = FullName;
}
}
DirectoryInfo[] Folders = TargDirectory.GetDirectories();
foreach (DirectoryInfo Folder in Folders)
{
string NewTargetFolder = Folder.FullName.ToString();
int FolderNameLength = Encoding.Default.GetByteCount(NewTargetFolder);
if (FolderNameLength > MaximumLength)
{
MaximumLength = FolderNameLength;
MaximumLengthFilePath = NewTargetFolder;
}
CheckPathLength(NewTargetFolder);
}
}
private void ShowResult()
{
LblTargFolder.Text = TargetFolder;
LblMaximumLength.Text = MaximumLength.ToString();
TextBoxMaxmimumPath.Text = MaximumLengthFilePath;
}
private void BtnGoToResultFolder_Click(object sender, EventArgs e)
{
string MaximumLengthFolderPath = "";
string[] ParsedPath = MaximumLengthFilePath.Split('\\');
for (int i=0; i<ParsedPath.Length-1; i++)
{
if (i>0) MaximumLengthFolderPath = MaximumLengthFolderPath + "\\" + ParsedPath[i];
}
System.Diagnostics.Process.Start(MaximumLengthFolderPath);
}
}
}
배포용 exe파일과 소스코드 둘다 첨부합니다.
(코딩 전문가가 아니므로 코드 못 짰어도 양해를..)
C:\Program Files
C:\Document and Setting
C:\Windows
C:\Users
같은 시스템 폴더나 다른사용자 폴더에는 접근 권한이 없는 프로그램이므로 이들 폴더 선택시 프로그램이 죽습니다.
관리자권한으로 실행 가즈아 기능 넣으면 되지 않을까요? ㅋㅋㅋ