Jim Lawrence (AccessD)
accessd at shaw.ca
Mon Sep 13 23:56:38 CDT 2004
Hi Stuart: This is part of the reply that I got from 'Notetab' a while when I was doing some research. Did not get as far as 'CrimsonEditor'. <comment from support> Theoretically, NoteTab can open 2GB files; it depends on system resources. To work correctly it needs twice as much RAM as the file size, so 4GB RAM in the largest case , but it can use drive space to work in. I don't believe there is a line limit, but there is a 32Kb column limit in NoteTab Pro and I think it is 2GB in Std/Light. Pro works much better with large file files than Std/Light. </comment from support> In John's case it may not be enough. There is a couple of APIs that are suppose to extend file access to any size and I have a app that using it and that seems to be the case. Maybe this class can be parled into a search and replace routine without musch effort... (The code is not mine but I have added and changed things.) <code> Option Explicit Public Enum W32F_Errors W32F_UNKNOWN_ERROR = 45600 W32F_FILE_ALREADY_OPEN W32F_PROBLEM_OPENING_FILE W32F_FILE_ALREADY_CLOSED W32F_Problem_seeking End Enum Private Const W32F_SOURCE = "Win32File Object" Private Const GENERIC_WRITE = &H40000000 Private Const GENERIC_READ = &H80000000 Private Const FILE_ATTRIBUTE_NORMAL = &H80 Private Const CREATE_ALWAYS = 2 Private Const OPEN_ALWAYS = 4 Private Const INVALID_HANDLE_VALUE = -1 Private Const FILE_BEGIN = 0, FILE_CURRENT = 1, FILE_END = 2 Private Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000 Private Declare Function FormatMessage Lib "kernel32" _ Alias "FormatMessageA" (ByVal dwFlags As Long, _ lpSource As Long, _ ByVal dwMessageId As Long, _ ByVal dwLanguageId As Long, _ ByVal lpBuffer As String, _ ByVal nSize As Long, _ Arguments As Any) As Long Private Declare Function ReadFile Lib "kernel32" _ (ByVal hFile As Long, _ lpBuffer As Any, _ ByVal nNumberOfBytesToRead As Long, _ lpNumberOfBytesRead As Long, _ ByVal lpOverlapped As Long) As Long Private Declare Function CloseHandle Lib "kernel32" _ (ByVal hObject As Long) As Long Private Declare Function WriteFile Lib "kernel32" _ (ByVal hFile As Long, _ lpBuffer As Any, _ ByVal nNumberOfBytesToWrite As Long, _ lpNumberOfBytesWritten As Long, _ ByVal lpOverlapped As Long) As Long Private Declare Function CreateFile Lib "kernel32" _ Alias "CreateFileA" (ByVal lpFileName As String, _ ByVal dwDesiredAccess As Long, _ ByVal dwShareMode As Long, _ ByVal lpSecurityAttributes As Long, _ ByVal dwCreationDisposition As Long, _ ByVal dwFlagsAndAttributes As Long, _ ByVal hTemplateFile As Long) As Long Private Declare Function SetFilePointer Lib "kernel32" _ (ByVal hFile As Long, _ ByVal lDistanceToMove As Long, _ lpDistanceToMoveHigh As Long, _ ByVal dwMoveMethod As Long) As Long Private Declare Function FlushFileBuffers Lib "kernel32" _ (ByVal hFile As Long) As Long Private hFile As Long, sFName As String, fAutoFlush As Boolean Private FileHandle1 As Long Public Property Get FileHandle() As Long If hFile = INVALID_HANDLE_VALUE Then RaiseError W32F_FILE_ALREADY_CLOSED Else FileHandle1 = hFile End If FileHandle = hFile End Property Public Property Get FileName() As String If hFile = INVALID_HANDLE_VALUE Then RaiseError W32F_FILE_ALREADY_CLOSED Else FileHandle1 = hFile End If FileName = sFName End Property Public Property Get IsOpen() As Boolean IsOpen = hFile <> INVALID_HANDLE_VALUE End Property Public Property Get AutoFlush() As Boolean If hFile = INVALID_HANDLE_VALUE Then RaiseError W32F_FILE_ALREADY_CLOSED Else FileHandle1 = hFile End If AutoFlush = fAutoFlush End Property Public Property Let AutoFlush(ByVal NewVal As Boolean) If hFile = INVALID_HANDLE_VALUE Then RaiseError W32F_FILE_ALREADY_CLOSED Else FileHandle1 = hFile End If fAutoFlush = NewVal End Property Public Sub OpenFile(ByVal sFileName As String) If hFile <> INVALID_HANDLE_VALUE Then RaiseError W32F_FILE_ALREADY_OPEN, sFName Else FileHandle1 = hFile End If hFile = CreateFile(sFileName, GENERIC_WRITE Or GENERIC_READ, 0, _ 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0) If hFile = INVALID_HANDLE_VALUE Then RaiseError W32F_PROBLEM_OPENING_FILE, sFileName End If sFName = sFileName End Sub Public Sub CloseFile() If hFile = INVALID_HANDLE_VALUE Then RaiseError W32F_FILE_ALREADY_CLOSED End If CloseHandle hFile sFName = "" fAutoFlush = False hFile = INVALID_HANDLE_VALUE End Sub Public Function ReadBytes(ByVal ByteCount As Long) As Variant Dim BytesRead As Long, Bytes() As Byte If hFile = INVALID_HANDLE_VALUE Then RaiseError W32F_FILE_ALREADY_CLOSED Else FileHandle1 = hFile End If ReDim Bytes(0 To ByteCount - 1) As Byte ReadFile hFile, Bytes(0), ByteCount, BytesRead, 0 ReadBytes = Bytes End Function Public Sub WriteBytes(DataBytes() As Byte) Dim fSuccess As Long, BytesToWrite As Long, BytesWritten As Long If hFile = INVALID_HANDLE_VALUE Then RaiseError W32F_FILE_ALREADY_CLOSED Else FileHandle1 = hFile End If BytesToWrite = UBound(DataBytes) - LBound(DataBytes) + 1 fSuccess = WriteFile(hFile, DataBytes(LBound(DataBytes)), _ BytesToWrite, BytesWritten, 0) If fAutoFlush Then Flush End Sub Public Sub Flush() If hFile = INVALID_HANDLE_VALUE Then RaiseError W32F_FILE_ALREADY_CLOSED Else FileHandle1 = hFile End If FlushFileBuffers hFile End Sub Public Sub SeekAbsolute(ByVal HighPos As Long, ByVal LowPos As Long) If hFile = INVALID_HANDLE_VALUE Then RaiseError W32F_FILE_ALREADY_CLOSED Else FileHandle1 = hFile End If LowPos = SetFilePointer(hFile, LowPos, HighPos, FILE_BEGIN) End Sub Public Sub SeekRelative(ByVal Offset As Long) Dim TempLow As Long, TempErr As Long If hFile = INVALID_HANDLE_VALUE Then RaiseError W32F_FILE_ALREADY_CLOSED Else FileHandle1 = hFile End If TempLow = SetFilePointer(hFile, Offset, ByVal 0&, FILE_CURRENT) If TempLow = -1 Then TempErr = Err.LastDllError If TempErr Then RaiseError W32F_Problem_seeking, "Error " & TempErr & "." & _ vbCrLf & CStr(TempErr) End If End If End Sub Private Sub Class_Initialize() hFile = INVALID_HANDLE_VALUE End Sub Private Sub Class_Terminate() If hFile <> INVALID_HANDLE_VALUE Then CloseHandle hFile End Sub Private Sub RaiseError(ByVal ErrorCode As W32F_Errors, _ Optional sExtra) Dim Win32Err As Long, Win32Text As String Dim lbStatus As Boolean Win32Err = Err.LastDllError lbStatus = True If Win32Err Then Win32Text = vbCrLf & "Error " & Win32Err & vbCrLf & _ DecodeAPIErrors(Win32Err) End If Select Case ErrorCode Case W32F_FILE_ALREADY_OPEN Err.Raise W32F_FILE_ALREADY_OPEN, W32F_SOURCE, lbStatus = False Case W32F_PROBLEM_OPENING_FILE Err.Raise W32F_PROBLEM_OPENING_FILE, W32F_SOURCE, lbStatus = False Case W32F_FILE_ALREADY_CLOSED Err.Raise W32F_FILE_ALREADY_CLOSED, W32F_SOURCE, lbStatus = False Case W32F_Problem_seeking Err.Raise W32F_Problem_seeking, W32F_SOURCE, lbStatus = False Case Else Err.Raise W32F_UNKNOWN_ERROR, W32F_SOURCE, lbStatus = False End Select If lbStatus = False Then CloseHandle FileHandle1 End Sub Private Function DecodeAPIErrors(ByVal ErrorCode As Long) As String Dim sMessage As String, MessageLength As Long sMessage = Space$(256) MessageLength = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0&, _ ErrorCode, 0&, sMessage, 256&, 0&) If MessageLength > 0 Then DecodeAPIErrors = Left(sMessage, MessageLength) Else DecodeAPIErrors = "Unknown Error." End If End Function </code> HTH Jim -----Original Message----- From: dba-sqlserver-bounces at databaseadvisors.com [mailto:dba-sqlserver-bounces at databaseadvisors.com]On Behalf Of Stuart McLachlan Sent: Monday, September 13, 2004 4:01 PM To: dba-sqlserver at databaseadvisors.com Subject: RE: [dba-SQLServer] Quotes in delimited data On 13 Sep 2004 at 11:18, John W. Colby wrote: > OK, now for a 660 field table? > 1. Get a good text editor with macro/block copy etc capablities such as Notetab Light, Crimson Editor etc. http://www.notetab.com/ http://www.crimsoneditor.com/ 2. Get a large pot of coffee....... -- Stuart _______________________________________________ dba-SQLServer mailing list dba-SQLServer at databaseadvisors.com http://databaseadvisors.com/mailman/listinfo/dba-sqlserver http://www.databaseadvisors.com