안녕하세요.

OpenFileDialog 를 이용해서 파일을 선택하고, 복사하는 방법을 간단하게 설명합니다.

Validation 은 따로 설정하기 않기때문에

파일이 선택되어지지 않은 상황에서의 에러 혹은 경고 메세지에 대해서는 양해 부탁드립니다.


먼저 기동하고난 후의 화면입니다.

복사할 대상 폴더로 이미 C: 의 test 폴더를 지정해둔 상황입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
Public Class Form1
 
    ''' <summary>
    ''' 파일을 선택합니다.
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub btnFileSelect_Click(sender As Object, e As EventArgs) Handles btnFileSelect.Click
 
        Dim OpenFileDialog1 As New OpenFileDialog()
        OpenFileDialog1.Title = "파일선택 타이틀입니다."
 
        ' 초기 디렉토리를 설정합니다.
        OpenFileDialog1.InitialDirectory = "C:\"
        ' 초기 선택파일명을 선택합니다.
        OpenFileDialog1.FileName = "초기파일명"
        ' 파일의 필터를 설정합니다.
        OpenFileDialog1.Filter = "텍스트파일|*.txt;*.log|전체파일|*.*"
        ' 필터의 초기설정입니다. 
        OpenFileDialog1.FilterIndex = 1
        ' 다이얼로그를 닫을때 마지막 설정을 유효로 하겠다는 설정입니다.
        OpenFileDialog1.RestoreDirectory = True
        ' 복수파일을 선택가능하게 합니다.
        OpenFileDialog1.Multiselect = False
        ' HELP 버튼을 표시합니다.
        OpenFileDialog1.ShowHelp = True
        ' 읽기전용으로 표시합니다.
        OpenFileDialog1.ShowReadOnly = True
        ' 체크박스를 표시합니다.
        OpenFileDialog1.ReadOnlyChecked = True
        ' 존재하지않는 파일을 선택했을때 경고를 표시합니다.
        'OpenFileDialog1.CheckFileExists = True
        ' 존재하지않는 경로를 지정했을때 경고를 표시합니다.
        'OpenFileDialog1.CheckPathExists = True
        ' 확장자가 존재하지 않는경우에는 확장자를 자동으로 붙여줍니다.
        'OpenFileDialog1.AddExtension = True
        ' 유효한 Win32 파일명만을 입력받게합니다.
        'OpenFileDialog1.ValidateNames = True
        ' 다이얼로그를 표시하고 OK 선택시에만 선택한 파일을 표시합니다.
        If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
            TextBox1.Text = OpenFileDialog1.FileName
            ' 파일이 복수선택 되었을때는 아래의 로직이 돌아가며 뿌려줍니다.
            'For Each nFileName As String In OpenFileDialog1.FileNames
            '    MessageBox.Show(nFileName)
            'Next nFileName
        End If
        ' 처리가 끝났으므로 파기합니다.
        OpenFileDialog1.Dispose()
    End Sub
    ''' <summary>
    ''' 파일을 지정된곳으로 복사합니다.
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub btnFileCopy_Click(sender As Object, e As EventArgs) Handles btnFileCopy.Click
        ' 파일명을 취득합니다.
        Dim fileName As String = System.IO.Path.GetFileName(TextBox1.Text)
        ' 파일을 복사합니다.
        System.IO.File.Copy(TextBox1.Text, TextBox2.Text & fileName, True)
        ' 파일을 이동합니다.
        'System.IO.File.Move("C:\test\1.txt", "C:\test\3.txt")
    End Sub
End Class
cs



btnFileSelect_Click 이벤트에서는

파일 선택창을 열어서 파일을 지정하도록 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
 
        Dim OpenFileDialog1 As New OpenFileDialog()
        OpenFileDialog1.Title = "파일선택 타이틀입니다."
 
        ' 초기 디렉토리를 설정합니다.
        OpenFileDialog1.InitialDirectory = "C:\"
        ' 초기 선택파일명을 선택합니다.
        OpenFileDialog1.FileName = "초기파일명"
        ' 파일의 필터를 설정합니다.
        OpenFileDialog1.Filter = "텍스트파일|*.txt;*.log|전체파일|*.*"
        ' 필터의 초기설정입니다. 
        OpenFileDialog1.FilterIndex = 1
        ' 다이얼로그를 닫을때 마지막 설정을 유효로 하겠다는 설정입니다.
        OpenFileDialog1.RestoreDirectory = True
        ' 복수파일을 선택가능하게 합니다.
        OpenFileDialog1.Multiselect = False
        ' HELP 버튼을 표시합니다.
        OpenFileDialog1.ShowHelp = True
        ' 읽기전용으로 표시합니다.
        OpenFileDialog1.ShowReadOnly = True
        ' 체크박스를 표시합니다.
        OpenFileDialog1.ReadOnlyChecked = True
        ' 존재하지않는 파일을 선택했을때 경고를 표시합니다.
        'OpenFileDialog1.CheckFileExists = True
        ' 존재하지않는 경로를 지정했을때 경고를 표시합니다.
        'OpenFileDialog1.CheckPathExists = True
        ' 확장자가 존재하지 않는경우에는 확장자를 자동으로 붙여줍니다.
        'OpenFileDialog1.AddExtension = True
        ' 유효한 Win32 파일명만을 입력받게합니다.
        'OpenFileDialog1.ValidateNames = True
        ' 다이얼로그를 표시하고 OK 선택시에만 선택한 파일을 표시합니다.
        If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
            TextBox1.Text = OpenFileDialog1.FileName
            ' 파일이 복수선택 되었을때는 아래의 로직이 돌아가며 뿌려줍니다.
            'For Each nFileName As String In OpenFileDialog1.FileNames
            '    MessageBox.Show(nFileName)
            'Next nFileName
        End If
        ' 처리가 끝났으므로 파기합니다.
        OpenFileDialog1.Dispose()
cs


btnFileCopy_Click 이벤트에서는 지정된 파일을 지정해둔 폴더로 복사 혹은 이동하는 역활을 합니다.

1
2
3
4
5
6
7
        ' 파일명을 취득합니다.
        Dim fileName As String = System.IO.Path.GetFileName(TextBox1.Text)
 
        ' 파일을 복사합니다.
        System.IO.File.Copy(TextBox1.Text, TextBox2.Text & fileName, True)
 
        ' 파일을 이동합니다.
cs


전체 소스는 아래 첨부파일을 참고하세요.

FileDialog.zip


질문

visual basic 질문 내공50

limh****
질문4건
질문마감률0%
질문채택률0%
2018.01.07. 22:27
조회수22
질문 1 : 매년 수능 날짜에서 오늘 날짜를 빼서 몇일남았는지 레이블에 띄우는 방법
(d-day 형식)

매년 수능 날짜에서 빼는 것이 어렵다면 올해 수능 날짜에서 오늘 날짜 빼는걸로라도 부탁드려요

질문 2 : 폼n 이 실행 되었을때 그 폼n 이 실행된지 얼마나 지났는지 시간 뜨위는 방법 
(00:00:00 로 시간 분 초 단위까지)





안녕하세요.
이번에는 Timer 를 이용한 시간차계산 방법과 특정일에 대해서 오늘까지 몇일이 남아있는지 D-Day 계산하는 방법에 대해서 간단하게 남겨보자합니다.

일단 구동화면은 아래와 같습니다.


오늘날짜는 2018/01/10 입니다.
수능이 2018/11/20 에 있다는 가정하에 남은일수가 313일 이네요.

우선 소스의 전체는 아래와 같습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Public Class Form1
 
    Dim finalDay As String = "2018/11/20 09:00:00"
    Dim startTime As String = Date.Now.ToString()
 
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
 
        Timer1.Interval = 1000
        Timer1.Start()
 
    End Sub
 
    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        Dim nowTime As String = Date.Now.ToString()
 
        Dim total, duration1, duration2 As TimeSpan
        duration1 = DateTime.Parse(nowTime).Subtract(DateTime.Parse(startTime))
        total = duration1.Add(duration2)
 
        lblTimer.Text = total.ToString()
 
        If lblDay.Text = String.Empty Then
            lblDay.Text = DateDiff(DateInterval.Day, DateTime.Now(), DateTime.Parse(finalDay)).ToString()
        End If
 
    End Sub
 
End Class
 
cs


프로젝트가 실행될때에 가장먼저 선언되는 부분이 맨위에 있는 선언문

1
2
    Dim finalDay As String = "2018/11/20 09:00:00"
    Dim startTime As String = Date.Now.ToString()
cs

입니다.

startTime 변수에 프로그램이 시작된 시간을 저장해두고 있습니다.


그리고, 이벤트 Form1_Load 는 다들 아시다시피 폼로드 이벤트 입니다.

폼이 로드될때에 가장먼저 실행이 되지요.


1
2
3
4
5
6
7
 
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
 
        Timer1.Interval = 1000
        Timer1.Start()
 
    End Sub
cs


폼이 로드될때에 타이머의 Interval 을 1000 으로 1초 단위로 Tick 이 이루어지도록 선언해두고 타이머를 동작시킵니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        Dim nowTime As String = Date.Now.ToString()
 
        Dim total, duration1, duration2 As TimeSpan
        duration1 = DateTime.Parse(nowTime).Subtract(DateTime.Parse(startTime))
        total = duration1.Add(duration2)
 
        lblTimer.Text = total.ToString()
 
        If lblDay.Text = String.Empty Then
            lblDay.Text = DateDiff(DateInterval.Day, DateTime.Now(), DateTime.Parse(finalDay)).ToString()
        End If
 
    End Sub
 
cs


그리고 1초가 흐를때마다 위의 Tick 메소드가 실행되어집니다.


1초당 동작시간을 기록해두고, 프로그램 실행시간과의 시간차를 계산하여

폼의 맨 아랫쪽에 보여줍니다. (1초당 한번 갱신)


그리고, 날짜가 기록되어있지 않은경우 (초기 기동시에만) 는

현재날짜와 수능일로 지정해둔 날짜의 차이를 계산해서 화면에 보여줍니다.


전체 소스는 아래에 첨부해두겠습니다.

즐프하세요~~


timerControl.zip


질문

VB.NET PerformClick관련해서 문의 드립니다. 내공100

visi****
질문22건
질문마감률85.7%
질문채택률85.7%
2018.01.09. 09:31
조회수7

VS 2017을 다운 받아서 사용해보고 있습니다.

 

If Input0 = True Then
     fTest.btnStart.PerformClick()
End If


If Input1 = True Then
     fTest.btnStop.PerformClick()
End If


If Input2 = True Then
     fTest.btnOrg.PerformClick()
End If

 

이런 식으로 입력을 받으면 각 버튼이 클릭 될 수 있도록 만들어봤습니다.

 

그런데 Input0, Input2는 정상적으로 되는데 Input1은 동작이 안됩니다.

fTest.btnStop.PerformClick()은 실행이 되는데

btnStop_Click쪽으로 넘어가지 않습니다.

어떤 이유에서 안넘어가는지 궁금합니다. 아시는 분 계시면 도움 부탁드립니다.





유사한 코드로 만들어서 아래와같이 테스트 해보았는데,

실제로 클릭이 잘 이루어집니다.
아마도 btnStop 이라는 버튼이 생각하신 버튼이 아닌, 다른버튼의 이름으로 지정되어있지 않은가? 생각됩니다.
혹은 버튼클릭 이벤트가 두가지로 복제되어 있는경우일수도 있습니다.

제가 테스트해본 내용은 아래와 같습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Public Class Form1
    Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
        If TextBox1.Text = "Input0" Then
            btnStart.PerformClick()
        End If
 
 
        If TextBox1.Text = "Input1" Then
            btnStop.PerformClick()
        End If
 
        If TextBox1.Text = "Input2" Then
            btnOrg.PerformClick()
        End If
    End Sub
 
    Private Sub btnStart_Click(sender As Object, e As EventArgs) Handles btnStart.Click
        MessageBox.Show("btnStart")
    End Sub
 
    Private Sub btnStop_Click(sender As Object, e As EventArgs) Handles btnStop.Click
        MessageBox.Show("btnStop")
    End Sub
 
    Private Sub btnOrg_Click(sender As Object, e As EventArgs) Handles btnOrg.Click
        MessageBox.Show("btnOrg")
    End Sub
End Class
cs


해당화면 이미지는 아래와 같습니다.
텍스트박스에 Input0  를 넣고 Button4 를 클릭하면 
btnStart.PerformClick()
이 작동하는 형식으로 만들어봤습니다.
첨부 이미지


csv 파일 데이터그리드뷰에 불러오기 도움이 필요합니다.  



csv 파일을 데이터그리드뷰로 불러와서 처리하려합니다.
파일을 콤마로 나눠서 셀에 불러오게되는데 콤마가 들어간 내용이 한두곳에 존재하게되서 데이터를 못읽어옵니다..
어느부분을 수정해야할지 도움부탁드립니다.
 
(* "csv", "텍스트 콤마" 검색으로는 정보를 찾을수가 없어 질문드립니다.)
 
 
====== 코드 내용 =======
 
        Dim filename = "d:\test.csv"
        Dim connString = String.Format("Provider=Microsoft.Jet.OleDb.4.0; Data Source={0};Extended Properties=""Text;HDR=no;FMT=Delimited""", Path.GetDirectoryName(filename))
        Using cn = New OleDbConnection(connString)
            cn.Open()
            Dim csvFile As String = "SELECT * FROM [" + Path.GetFileName(filename) + "]"
            Using adapter = New OleDbDataAdapter(csvFile, cn)
                Dim ds = New DataSet()
                adapter.Fill(ds)
                DataGridView1.DataSource = ds.Tables(0)
                cn.Close()
                Beep()
            End Using
        End Using
 
 
 
csv 파일을 메모장에서 불러왔을때
csv 메모장으로 열었을때
 
 
 
csv 파일을 엑셀에서 불러왔을때
csv 엑셀로 열었을때
 
 
 
vb 코드 실행했을시 빈 칸 발생
vb 실행했을때



참, 정리가 잘 된 질문이다.
무엇을 물어보고자 하는지가 명확하게 보인다.
이 질문에 대해서 답변을 하고자, 좀 정리해보았다.
샘플파일을 첨부한다.

아래가 해결방안


        Dim csvDir As String = "C:\test\"

        Dim csvFileName As String = "test.csv"


        Dim conString As String = _

            "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" _

            + csvDir + ";Extended Properties=""text;HDR=No;FMT=Delimited"""

        Dim con As New System.Data.OleDb.OleDbConnection(conString)


        Dim commText As String = "SELECT * FROM [" + csvFileName + "]"

        Dim da As New System.Data.OleDb.OleDbDataAdapter(commText, con)


        Dim dt As New DataTable

        da.Fill(dt)


        DataGridView1.DataSource = dt



해당 소스를 첨부는 아래를 참고하세요.


[소스]


WindowsApplication2.zip



[테스트용 csv 파일]


test.csv



즐프하세요.

Framework 4.0 부터 exe 파일간에 메모리 매핑 (MemoryMappedFile) 메소드를 사용해서

필요한 데이터를 공유할수 있다.

 

 

상속상위 계층

System.Object
  System.IO.MemoryMappedFiles.MemoryMappedFile

 

 

MemoryMappedFile 메소드를 이용하여 데이터를 쉽게 공유할수 있다.

물론 타겟이 되는 폼의 New 메소드에 파라메터로 전달하는 방법도 있지만,

MemoryMappedFile 의 경우는 타 exe 파일들간에 데이터 공유도 손쉽게 할수있다는 장점이 있다.

 

사용법은 아래와 같다.

 

<메모리에 쓰는방법>

     ''' <summary>
    ''' 메모리에 쓰는방법
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub MakeMemoryMappedFile(ByVal tar As String, ByVal tarText As String)
        'Dim File = MemoryMappedFile.CreateOrOpen(target, MaxSize)
        Dim File = MemoryMappedFile.CreateOrOpen(target, MaxSize)
       
        Dim bytes = New Byte() {}
        bytes = StrToByteArray(tarText)

        Using writer = File.CreateViewAccessor(0, bytes.Length)

            writer.WriteArray(Of Byte)(0, bytes, 0, bytes.Length)

        End Using

 

    End Sub

 

 

 

<메모리로부터 읽는방법>

 
    ''' <summary>
    ''' 메모리로부터 읽는방법
    ''' </summary>
    ''' <remarks></remarks>
    Private Function ReadMemoryMappedFile(ByVal tarMem As String) As String
        Dim result As String = ""

        Try
            Using file = MemoryMappedFile.OpenExisting(tarMem)
                Using reader = file.CreateViewAccessor(0, MaxSize)

                    Dim bytes = New Byte(MaxSize) {}
                    reader.ReadArray(Of Byte)(0, bytes, 0, bytes.Length)

                    result = System.Text.Encoding.UTF8.GetString(bytes)

                End Using
            End Using

            Return result

            'Catch noFile As FileNotFoundException
            '    MsgBox("Error : " + noFile.Message)
            '    Return result

        Catch Ex As Exception
            Return result
        End Try

    End Function

 

 

<실제 사용예제> 

 

 MakeMemoryMappedFile(키값, 넣을내용)
 

 ReadMemoryMappedFile(키값)

 

 

 

필자는 위의 방법으로 현재 개발중인 exe 모듈 140여개인 SmartClient 솔류션 간의 공통데이터 공유에 적용중이다.

 

물론, 데이터를 암호화해서 암호화된 값을 넣어두고

끌어다쓰는 모듈쪽에서 복호화해서 받아쓰는 방법이 보안상은 좀 더 나을것이다.

+ Recent posts