파일 저장 부분에서 이상한 현상이 발생하여 문의 드립니다.
현재 EditText 에서 값을 입력받아 폴더 생성 후 생성된 폴더내에 파일을 저장하고 있습니다.
그런데 앞서 저장한 파일에 덮어쓰기가 되는 현상이 발생합니다.
예를 들어 아래 소스와 같이
EditText 에 "jang" 이라고 입력
"jang_sg" 이라는 폴더 생성
"jang_sg" 폴더에 데이터를 두번에 걸쳐 파일로 저장 ("jang_sg" 폴더에 M_Sign0.pas, M_Sign1.pas 생성)
생성된 파일의 내용을 확인해 보면
10,10,10,10,10,10,10,10,10,10,10,10,10,10,10
이렇게 정상적으로 저장되어 있고요.
다시 EditText 에 "kang" 이라고 입력하여
"kang_sg" 이라는 폴더 생성
"kang_sg" 폴더에 데이터를 한번만 파일로 저장 (M_Sign0.pas 생성) 하여
"kang_sg" 의 M_Sign0.pas 데이터를 확인해 보면 아래와 같이 정상적으로 저장되어 있지만
20,20,20,20,20,20,20,20,20,20,20,20,20,20,20
엉뚱하게 먼저 입력했던 "jang_sg" 폴더내의 M_Sign1.pas 파일의 내용들이
"kang_sg" 의 M_Sign0.pas 내용들로 바뀌어 있습니다.
예상하건대 "kang_sg" 의 M_Sign0.pas를 생성하면서 동시에
"jang_sg" 폴더내의 M_Sign1.pas 파일에 덮어쓰기 하는것 같습니다.
AndroidManifest.xml 에 아래와 같이 설정 하였고요.
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
도대체 왜 이러는지 원인을 알수 없네요.
혹 경로가 잘못됐나 해서 메세지로 찍어봐도 경로는 이상없습니다.
도움 말씀 부탁드립니다.
public class MainActivity extends Activity implements OnClickListener{
Button okbtn;
Button closebtn;
EditText id;
String ID;
int count;
String mSdPath;
String strSgPw;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
okbtn = (Button)findViewById(R.id.idokbtn);
closebtn = (Button)findViewById(R.id.closebtn);
id = (EditText)findViewById(R.id.trueid);
id.setText("");
ID = "";
strSgPw = "_sg";
count = 0;
okbtn.setOnClickListener(this);
closebtn.setOnClickListener(this);
//SD카드경로
String ext = Environment.getExternalStorageState();
if(ext.equals(Environment.MEDIA_MOUNTED))
{
mSdPath = Environment.getExternalStorageDirectory().getAbsolutePath();
}
else
{
mSdPath = Environment.MEDIA_UNMOUNTED;
}
//SD카드에 데이터를 저장할 SignData 폴더를 만든다.
File dir = new File(mSdPath + "/SignData");
if(!dir.exists()) //폴더가 없다면 생성
{
dir.mkdir();
}
}
//버튼 클릭 이벤트
public void onClick(View v) {
switch(v.getId()){
case R.id.okbtn: //ok 버튼 클릭
ID = id.getText().toString();
if(ID.equals(""))
{
MsgBox("ID 입력해 주세요.");
}
else
{
int num = 5;
int [] Sign = new int[num*3];
//버퍼에 데이터 담기.
if(ID.equals("jang")) //ID 가 "jang" 이라면
{
for(int i=0; i<num; i++ )
{
Sign[i*3] = 10;
Sign[i*3+1] = 10;
Sign[i*3+2] = 10;
}
}
else
{
for(int i=0; i<num; i++ )
{
Sign[i*3] = 20;
Sign[i*3+1] = 20;
Sign[i*3+2] = 20;
}
}
//현재까지 저장된 데이터 개수를 가져온다.
OnGetSignCount(mSdPath + "/SignData/" + ID + strSgPw + "/TRUE/M_count.pas");
if(count == 0) //처음 입력이라면 폴더부터 생성
{
File dir = new File(mSdPath + "/SignData/" + ID + strSgPw);
if(!dir.exists()) //ID 폴더 생성
{
dir.mkdir();
}
dir = new File(mSdPath + "/SignData/" + ID + strSgPw + "/TRUE");
if(!dir.exists()) // TRUE 폴더 생성
{
dir.mkdir();
}
}
//데이터 저장
SaveSignPasFile(mSdPath + "/SignData/" + ID + strSgPw + "/TRUE/M_Sign"+count+".pas",num,Sign);
Sign = null;
count++;
//현재까지 저장된 데이터 개수를 저장한다.
OnSaveSignCount(mSdPath + "/SignData/" + ID + strSgPw + "/TRUE/M_count.pas");
}
break;
case R.id.closebtn: //종료
finish();
break;
}
}
//현재까지 저장된 데이터 개수를 가져온다. M_count.pas 파일이 없으면 count=0 을...있으면 그냥 값만 꺼내옴.
public void OnGetSignCount(String countFileName)
{
File dir = new File(countFileName);
if(!dir.exists())
{
count = 0;
}
else
{
DataInputStream dis = null;
try
{
dis = new DataInputStream(new FileInputStream(countFileName));
count = dis.readInt();
dis.close();
}
catch(FileNotFoundException e)
{
;
}
catch(IOException e)
{
;
}
}
}
//서명입력 개수를 저장한다.
public void OnSaveSignCount(String countFileName )
{
DataOutputStream dos;
try
{
dos= new DataOutputStream(new FileOutputStream(countFileName));
dos.writeInt(count);
dos.flush();
dos.close();
}
catch(FileNotFoundException e)
{
;
}
catch(SecurityException e)
{
;
}
catch(Exception e)
{
;
}
}
//데이터 파일로 저장
public void SaveSignPasFile(String pasFileName,int FSignNum,int [] FSign)
{
//데이터를 저장할 경로 출력
new AlertDialog.Builder(this)
.setTitle("파일 저장 경로")
.setMessage(pasFileName)
.setIcon(R.drawable.ic_launcher)
.setPositiveButton("확인,null)
.setCancelable(false)
.show();
DataOutputStream dos;
try
{
dos= new DataOutputStream(new FileOutputStream(pasFileName));
dos.writeInt(FSignNum);
for(int i=0; i<FSignNum*3; i++) dos.writeInt(FSign[i]);
dos.flush();
dos.close();
}
catch(FileNotFoundException e)
{
;
}
catch(SecurityException e)
{
;
}
catch(Exception e)
{
;
}
}
}